这里重新开一个新帖,解决没解决的问题。通过点击,产生一个任务。如果上一个任务没有完成,则结束上一个任务,并创建一个新的任务。任务例子不是循环型的任务,仅仅是打印一个很长的序列.而且我不知道什么时候任务结束,只是点击按钮的时候,如果有正在执行中的任务,则结束掉,并创建一个新任务;如果没有正在执行的任务,则同样创建一个新的任务。现在的思路是利用Timer或者ScheduledExecutorService,但是我都没办法写出来。大家可以参考这个网址:http://topic.csdn.net/u/20120926/09/24ff4c3d-ec7b-42e9-97a6-febfae4afb3e.html希望大家帮助我程序中最后一个问题,先谢谢大家,祝大家中秋,国庆愉快。
这里重新开一个新帖,解决没解决的问题。通过点击,产生一个任务。如果上一个任务没有完成,则结束上一个任务,并创建一个新的任务。任务例子不是循环型的任务,仅仅是打印一个很长的序列.而且我不知道什么时候任务结束,只是点击按钮的时候,如果有正在执行中的任务,则结束掉,并创建一个新任务;如果没有正在执行的任务,则同样创建一个新的任务。现在的思路是利用Timer或者ScheduledExecutorService,但是我都没办法写出来。大家可以参考这个网址:http://topic.csdn.net/u/20120926/09/24ff4c3d-ec7b-42e9-97a6-febfae4afb3e.html希望大家帮助我程序中最后一个问题,先谢谢大家,祝大家中秋,国庆愉快。
OK,那么是可能可以的,两种方法:
1、在读取完一个帖子后,继续读取下一个帖子之前,检查中断标志。
2、强制close掉读取帖子的那个 Socket和InputStream,流一旦被关系,后续操作就会直接抛出Exception,在catch中检测中断标志,决定是重试还是结束运行。
import java.io.*;
import java.net.*;public class CancelTask { private volatile static MyWorker currentJob; public static void main(String[] args) throws Exception {
CancelTask.startJob();
Thread.sleep(2000);
CancelTask.startJob();
} /**
* 该函数负责启动新任务,如果旧任务还没结束,则试图将其终止掉。
*/
public static synchronized void startJob() {
if (currentJob != null) {
currentJob.interrupt();
}
currentJob = new MyWorker();
currentJob.start();
} /**
* 下载网页的工作者
*/
private static class MyWorker extends Thread {
private volatile boolean stoped = false;
private volatile Reader reader;
public void interrupt() {
System.err.println("\nInterrupt!!!\n");
this.stoped = true;
try {
reader.close(); // 强制关闭输入流,将会造成Exception
} catch (Exception ex) {
ex.printStackTrace();
}
super.interrupt();
} public void run() {
try {
URL url = new URL("http://www.sina.com.cn/");
URLConnection cn = url.openConnection();
reader = new InputStreamReader(cn.getInputStream());
int c;
while ((c = reader.read()) != -1) {
System.out.print((char) c);
Thread.sleep(1);
}
} catch (Exception e) {
if (this.stoped) {
// 如果被停止了,说明是主调线程要求终止所导致的异常
System.err.println("\nI had been canceled...\n");
return;
}
e.printStackTrace(); // 说明真的是发生异常了,而不是被要求终止的
// Maybe retry to download the HTML.
} }
}
}