Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何取消执行器的运行任务_Java_Multithreading - Fatal编程技术网

Java 如何取消执行器的运行任务

Java 如何取消执行器的运行任务,java,multithreading,Java,Multithreading,包装样品 import java.util.TimerTask; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Future; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.T

包装样品

import java.util.TimerTask;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Future;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExecutorEg {
  TimerTask timerTask;
  int  oneThread       = 1;
  long zeroKeepAlive   = 0L;
  int  queueDepthOfOne = 1;

  ThreadPoolExecutor threadPoolExecutor =
        new ThreadPoolExecutor(
              oneThread,
              oneThread,
              zeroKeepAlive,
              TimeUnit.MILLISECONDS,
              new ArrayBlockingQueue<Runnable>(queueDepthOfOne)
        );
  private volatile static Future<?> self;
public static void main(String args[]){
  ThreadPoolExecutorEg myTimer = new ThreadPoolExecutorEg();
  myTimer.waitAndSweep("A");
  myTimer.waitAndSweep("B");

  cancel();
  myTimer.waitAndSweep("replace");
  myTimer.waitAndSweep("B");

}

private static void cancel() {
self.cancel(true); 
System.out.println(self.isCancelled());
}

public void waitAndSweep(final String caller) {
  try { 


      timerTask = new TimerTask() {

        @Override
        public void run() {
          try {
          long waitTime = 1000;
            if (waitTime > 0){
              Thread.sleep(waitTime);
            }

          } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          System.out.println(caller);
        }
      };

    self = threadPoolExecutor.submit(timerTask);


  }catch(RejectedExecutionException re){
System.out.println(re);
  }
  catch (Exception e) {

  }
}
}
import java.util.TimerTask;
导入java.util.concurrent.ArrayBlockingQueue;
导入java.util.concurrent.Future;
导入java.util.concurrent.RejectedExecutionException;
导入java.util.concurrent.ThreadPoolExecutor;
导入java.util.concurrent.TimeUnit;
公共类线程池{
TimerTask TimerTask;
int-oneThread=1;
长零保持寿命=0L;
int queueDepthOfOne=1;
ThreadPoolExecutor线程池执行器=
新线程池执行器(
一个线程,
一个线程,
零保持生命,
TimeUnit.ms,
新的ArrayBlockingQueue(queueDepthOfOne)
);
个人未来自我;
公共静态void main(字符串参数[]){
ThreadPoolExecutorEg myTimer=新的ThreadPoolExecutorEg();
myTimer.waitAndSweep(“A”);
myTimer.waitAndSweep(“B”);
取消();
myTimer.waitAndSweep(“替换”);
myTimer.waitAndSweep(“B”);
}
私有静态void cancel(){
self.cancel(true);
System.out.println(self.isCancelled());
}
公共void waitAndSweep(最终字符串调用方){
试试{
timerTask=新的timerTask(){
@凌驾
公开募捐{
试一试{
长等待时间=1000;
如果(等待时间>0){
睡眠(等待时间);
}
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
System.out.println(调用者);
}
};
self=threadPoolExecutor.submit(timerTask);
}捕获(拒绝执行异常re){
系统输出打印项次(re);
}
捕获(例外e){
}
}
}
在cancel方法中,运行的任务不会被取消。有没有办法取消正在运行的任务,即使线程处于睡眠状态,我想中断线程的睡眠并终止整个任务


什么情况下取消(true)可能会失败?

您需要的是
列表您需要的是
列表这里至少有一半的代码不需要或不做任何事情。你可以简化这个例子,让它更容易理解。这里至少有一半的代码是不需要的,或者没有做任何事情。您可以简化此示例以使其更易于理解。虽然这可能是一个问题,但OP一次只提交一个任务,并试图取消最后一个任务。为什么我们需要维护未来列表?您正在执行多个
提交
,因此每个提交的任务都有多个
未来
。分配给一个
self
变量将覆盖以前提交的所有任务
future
,这是您打算做的吗?在一个列表中设置未来列表和取消所有未来对我有效。非常感谢你!虽然这可能是一个问题,但OP一次只提交一个任务,并试图取消最后一个任务。为什么我们需要维护未来任务列表?您正在执行多个
submit
,因此每个提交的任务都有多个
future
。分配给一个
self
变量将覆盖以前提交的所有任务
future
,这是您打算做的吗?在一个列表中设置未来列表和取消所有未来对我有效。非常感谢你!