java关闭未执行完的线程_发现在JAVA中完全没办法用另一个线程去中断一个正在运行的线程,...

引用来自“爱吃大肉包”的答案

引用来自“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就是了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值