java 线程中断 恢复_Java ExecutorService暂停/恢复特定线程

你在错误的轨道上。线程池拥有线程并通过与您的代码共享它们可能会搞砸了。

您应该关注将您的任务(传递给线程可取消/可中断),并且不直接与池拥有的线程进行交互。

此外,您不会不知道被你尝试中断线程时执行什么样的工作,所以我不明白为什么你有兴趣做这个

更新:

的正确方法取消您在线程池中提交的任务是通过Future执行程序返回的任务。

1)通过这种方式,你可以肯定地知道你实际上瞄准的任务试图取消

2)如果你的任务已经被设计成可以取消的话那么你的中途就是一半

3)不要使用标志指示取消,但使用Thread.currentThread().interrupt()代替

更新:

public class InterruptableTasks {

private static class InterruptableTask implements Runnable{

Object o = new Object();

private volatile boolean suspended = false;

public void suspend(){

suspended = true;

}

public void resume(){

suspended = false;

synchronized (o) {

o.notifyAll();

}

}

@Override

public void run() {

while(!Thread.currentThread().isInterrupted()){

if(!suspended){

//Do work here

}

else{

//Has been suspended

try {

while(suspended){

synchronized(o){

o.wait();

}

}

}

catch (InterruptedException e) {

}

}

}

System.out.println("Cancelled");

}

}

/**

* @param args

* @throws InterruptedException

*/

public static void main(String[] args) throws InterruptedException {

ExecutorService threadPool = Executors.newCachedThreadPool();

InterruptableTask task = new InterruptableTask();

Map tasks = new HashMap();

tasks.put(1, task);

//add the tasks and their ids

Future> f = threadPool.submit(task);

TimeUnit.SECONDS.sleep(2);

InterruptableTask theTask = tasks.get(1);//get task by id

theTask.suspend();

TimeUnit.SECONDS.sleep(2);

theTask.resume();

TimeUnit.SECONDS.sleep(4);

threadPool.shutdownNow();

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值