立即停止线程中的Runnable

时间:2015-01-07 00:54:25

标签: java multithreading stm

我尝试在java中使用某种调度程序实现软件事务内存库的一个版本,该调度程序包含一些Thread对象。我想实现一种机制,其中调度程序告诉Thread立即停止执行,删除其Runnable,创建一个新的并重新运行它。到目前为止,这实际上是半熟的,但我不想要的是重新创建漏洞线程,因为它将作为多个变量的状态持有者(只有线程具有的其他变量的深度复制 - 复制任务在这里是一个阻塞所以线程不应该完全重新创建)

我的问题是我不知道在执行时终止方法的任何事情并释放所有资源(如果调度程序告诉线程重新启动Runnable所做的一切无效并且必须重做)并启动使用新输入变量再次运行run方法。

目标是避免不执行的执行,并且runnable中不应该有任何变量,询问它是否被中断,然后跳过执行或其他东西。只需停止执行并从runnable本身无法识别的东西中删除它。我希望它清楚我想要什么,如果不是请求不明确的点帮助将非常感激:)

1 个答案:

答案 0 :(得分:2)

取消Runnable并再次启动它的简单教程。

public class RestartThreadTutorial {
public static void main(String args[]){
    ExecutorService executorService = Executors.newFixedThreadPool(5);
    Future<?> taskHandler = executorService.submit(new Task());
    //restart the task after 3 seconds.
    try{
        Thread.sleep(3000);
    }catch(InterruptedException e){
        //empty
    }
    taskHandler.cancel(true); //it will cancel the running thread
    if (taskHandler.isCancelled()==true){//check the thread is cancelled
        executorService.submit(new Task());//then create new thread..
    }
}

public static class Task implements Runnable{
    private int secondsCounter;
    @Override
    public void run(){
        while(true){
            System.out.println("Thread -"+Thread.currentThread().getName()+"elapsed - "+ (secondsCounter++) +"second");
            try{
                Thread.sleep(1000);
            }catch(InterruptedException e){
                e.printStackTrace();
                break;
            }
        }
    }
}
}