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
,这是您打算做的吗?在一个列表中设置未来列表和取消所有未来对我有效。非常感谢你!