我已经提交了两项任务task1
& task2
到ExecutorService。 Task2需要5秒钟才能完成,而task1需要10秒钟。
当task2完成并继续其余的逻辑时,如何停止提交的任务(即:task1)?
到目前为止,这是我的代码:
public class mt_poc {
public static void action_1 () throws InterruptedException {
System.out.println("action_1 invoke " );
Thread.sleep(10000);
action_2 ();
System.out.println("action_1 done" );
}
public static void action_2() throws InterruptedException {
System.out.println("action_2 invoke " );
Thread.sleep(5000);
System.out.println("action_2 done " );
}
public static void main(String[] args) {
System.out.println("TEST");
Runnable task1 = new Runnable() {
public void run() {
try {
action_1 ();
}
catch(InterruptedException e) {
System.out.println("action_1 invoke interrupted");
}
System.out.println("action_1 invoke run is over" );
}
};
Runnable task2 = new Runnable() {
public void run() {
try {
action_2 ();
}
catch(InterruptedException e) {
System.out.println("action_2 invoke interrupted");
}
System.out.println("action_2 invoke run is over" );
}
};
ExecutorService executor = Executors.newFixedThreadPool(2);
try {
executor.submit(task1);
executor.submit(task2);
// cancel uncomplete task
executor.shutdown();
executor.awaitTermination(5, TimeUnit.SECONDS);
// continues the rest of logic
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Shutdown executor");
}
}
答案 0 :(得分:0)
您可以使用shutdownNow()
方法
尝试停止所有正在执行的任务,停止处理 等待任务,并返回正在等待的任务列表 执行。
完整文档:
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html
shutdown()
方法将在关闭执行程序之前等待所有线程完成
答案 1 :(得分:0)
您必须从Future
功能中检索submit
个对象
这些用于控制正在运行的线程并获取它的状态。
如果您有期货,请致电Future2.get()
。这将阻止线程,直到Task2
完成。不,您可以使用Future1.cancel(true)
中止其他线程。
但暂停和恢复是不可能的。见Java ExecutorService pause/resume a specific thread
如果您想要这样的特定行为,则需要使用Threads。
但是为什么你要在单独的线程中这样做,因为使用单个线程会更简单有效。