引用来自“爱吃大肉包”的答案
引用来自“Grrrr”的答案
真搞不懂,sun 已经推荐使用ExecutorService框架来处理thread了,为什么还是不用.
Executor
提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。
可以关闭ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭
ExecutorService。shutdown()
方法在终止前允许执行以前提交的任务,而 shutdownNow()
方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的
ExecutorService以允许回收其资源。
@Grrrr看后面有说明的
而且在提供的concurrent包中也不行,他有个方法future().cancel(true);尝试去终止正在运行的线程,也是不起作用滴
你可以尝试下,这个只是尝试而已,和那个system.gc()一个意识,试图中断而已
回复 @Grrrr :1, 我上面的代码就是这种方法,看清楚我的问题,我是说不能终止下面的System.out.println("can't break me,I also run,hahaha ");
这句,看清楚Thread.currentThread().isInterrupted(),这个是JDK提供的标准的native实现的Boolean变量
2,请看JDK代码, ex.shutdown(); 跟踪下去,可以看到JDK代码interruptIdleWorkers()
for (Worker w : workers) {
Thread t = w.thread;
if (!t.isInterrupted() && w.tryLock()) {
try {
t.interrupt();
} catch (SecurityException ignore) {
} finally {
w.unlock();
}
}
实现方式和我贴出来的差不多。一样终止不了。
看下面用Executor的实现,始终要执行这句。
System.out.println("can't break me,I also run,hahaha ");
package org.benson;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* TODO show how to interrupt a thread
* @author Benson QQ 107966750
*/
public class Test4ThreadHistory implements Callable {
static int i=0;
@Override
public String call() {
while(!Thread.currentThread().isInterrupted()){
// i happy run , please break me
System.out.println("I'm runing "+i++);
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();//because currentThread flag will restore after throw the exception
}
System.out.println("can't break me,I also run,hahaha ");
}
return null;
}
public static void main(String[] args) throws InterruptedException {
Callable t1=new Test4ThreadHistory();
ExecutorService ex=Executors.newCachedThreadPool();
java.util.concurrent.Future future=ex.submit(t1);
Thread.sleep(1000);
future.cancel(true);
ex.shutdown();
}
}
回复@爱吃大肉包 : 我尝试了好几年了。你自己还是动手写写代码吧。 给你个我原来写的例子,用非阻塞玩的,别纠结等待通知了,现在都非阻塞了
返送你一句,还是看清楚需求,不过也谢谢你的回答
其实现在我改进的话可以这样是可以
在exception里处理异常后直接调用stop就是了