立即停止线程中的 Runnable
Stop a Runnable in a Thread imediatly
我尝试在 java 中使用某种包含一些 Thread 对象的调度程序来实现软件事务内存库的一个版本。我想实现一种机制,调度程序告诉线程立即停止执行,删除它的 Runnable,创建一个新的并重新运行它。到目前为止,这实际上是半熟的,但我不想要的是重新创建空洞线程,因为它将作为多个变量的状态持有者工作(其他变量的深度复制只有线程有 - 复制任务在这里是一个障碍,所以线程不应完全重新创建)
我的问题是我不知道有什么会在方法执行时终止它并释放所有资源(如果调度程序告诉线程重新启动 Runnable 所做的一切都是无效的并且必须重做)并开始run 方法再次使用新的输入变量。
目标是避免不必要的执行,runnable 中不应该有变量询问它是否被中断然后跳过执行或其他东西。只需停止执行并将其从可运行本身不知道的东西中杀死即可。我希望很清楚我想要什么,如果不清楚,请寻求帮助,我们将不胜感激:)
取消 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;
}
}
}
}
}
我尝试在 java 中使用某种包含一些 Thread 对象的调度程序来实现软件事务内存库的一个版本。我想实现一种机制,调度程序告诉线程立即停止执行,删除它的 Runnable,创建一个新的并重新运行它。到目前为止,这实际上是半熟的,但我不想要的是重新创建空洞线程,因为它将作为多个变量的状态持有者工作(其他变量的深度复制只有线程有 - 复制任务在这里是一个障碍,所以线程不应完全重新创建)
我的问题是我不知道有什么会在方法执行时终止它并释放所有资源(如果调度程序告诉线程重新启动 Runnable 所做的一切都是无效的并且必须重做)并开始run 方法再次使用新的输入变量。
目标是避免不必要的执行,runnable 中不应该有变量询问它是否被中断然后跳过执行或其他东西。只需停止执行并将其从可运行本身不知道的东西中杀死即可。我希望很清楚我想要什么,如果不清楚,请寻求帮助,我们将不胜感激:)
取消 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;
}
}
}
}
}