gpt4 book ai didi

java - Future.cancel(boolean) 方法的实用程序

转载 作者:IT老高 更新时间:2023-10-28 20:49:48 61 4
gpt4 key购买 nike

我只是在探索 java.util.concurrent 包。

我了解到类 'Future' 有一个方法 boolean cancel(boolean mayInterruptIfRunning)

请附上我写的测试代码:

package com.java.util.concurrent;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;

public class FutureTester {

/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
int poolCnt = 1;
Callable<NumberPrinter> numberPrinter = null;
ScheduledThreadPoolExecutor schPool = new ScheduledThreadPoolExecutor(
poolCnt);
ScheduledFuture<NumberPrinter>[] numPrinterFutures = new ScheduledFuture[poolCnt];
FutureTask<NumberPrinter>[] futureTask = new FutureTask[poolCnt];

for (int i = 0; i < poolCnt; i++) {
numberPrinter = new NumberPrinter();
futureTask[i] = new FutureTask<NumberPrinter>(numberPrinter);

/*
* numPrinterFutures[i] = (ScheduledFuture<NumberPrinter>) schPool
* .schedule(futureTask[i], 0, TimeUnit.MILLISECONDS);
*/
numPrinterFutures[i] = (ScheduledFuture<NumberPrinter>) schPool
.submit(futureTask[i]);
}

//Thread.sleep(30);

if (numPrinterFutures.length > 0) {

System.out.println("Task completed ? "
+ numPrinterFutures[0].isDone());

System.out.println("Task cancelled ? "
+ numPrinterFutures[0].cancel(true));

System.out.println("Is task cancelled ? "
+ numPrinterFutures[0].isCancelled());
}
}

}

class NumberPrinter implements Callable<NumberPrinter> {

private int counter = 10;

@Override
public NumberPrinter call() throws Exception {
// TODO Auto-generated method stub

while (counter > 0) {
if (Thread.interrupted()) {/*OUCH !!!*/
return null;
}
System.out.println("counter = " + (counter--));
}

return this;
}

}

最初,我假设取消任务也会停止正在运行的线程的执行(不包括“OUCH”部分)。但我得到的输出为如下:

counter = 10
Task completed ? false
counter = 9
Task cancelled ? true
counter = 8
Is task cancelled ? true
counter = 7
counter = 6
counter = 5
counter = 4
counter = 3
counter = 2
counter = 1

在进一步阅读stackoverflow本身时,据说

  1. 'cancel'方法只能停止'unstarted'作业(与方法的api描述相矛盾)
  2. cancel 方法只是中断正在运行的线程,然后必须从 run() 方法返回

因此,我包含了 'OUCH' 部分 - 一个 while 循环检查中断;输出如下:

Task completed ? false
counter = 10
Task cancelled ? true
Is task cancelled ? true

问题:

如果应该编写类似于“OUCH”部分的内容来停止正在运行的线程,那么取消方法的实用程序/值(value)是什么。如果无法通过取消来停止线程,将 Callable 包装在 FutureTask 中有何帮助?我忽略的设计/概念/逻辑部分是什么?

最佳答案

How does wrapping a Callable in a FutureTask help if the Thread can't be stopped by cancel?

您想取消任务,而不是运行它的线程。使用 cancel(true) 可防止任务启动(但不会将其从队列中删除)并在任务已启动时中断线程。任务可以忽略中断,但是没有干净的方法可以在不杀死整个进程的情况下杀死线程。

关于java - Future.cancel(boolean) 方法的实用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9536555/

61 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com