Mak*_*iev 4 java multithreading interrupt threadpool
MyThread.interrupt()当我取消当前正在执行的任务时,我需要被调用.为什么不是公共类主要{
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(10);
List<MyThread> threads = new ArrayList<Main.MyThread>();
List<Future> futureList = new ArrayList<Future>();
for (int i = 0; i < 30; i++) {
MyThread myThread = new MyThread(i);
futureList.add(executor.submit(myThread));
threads.add(myThread);
}
for (Future future : futureList) {
if (future != null) {
future.cancel(true);
}
}
// Calling interrupt directly. It works
for (MyThread myThread : threads) {
myThread.interrupt();
}
shutdownAndAwaitTermination(executor);
}
static void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
if (!pool.awaitTermination(10, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(10, TimeUnit.SECONDS)) System.err.println("Pool did not terminate");
else System.out.println("Maybe OK");
} else {
System.out.println("OK");
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
private static class MyThread extends Thread {
HttpURLConnection connection;
final int i;
public MyThread(int i) {
this.i = i;
}
@Override
public void interrupt() {
super.interrupt();
if (connection != null) {
connection.disconnect();
}
}
@Override
public void run() {
// Initialize HttpURLConnection and upload / download data
}
}
Run Code Online (Sandbox Code Playgroud)
}
它被调用,在这里改变它并看到输出
...
} catch (InterruptedException e) {
System.out.println(i + " interrupted");
Thread.currentThread().interrupt();
}
...
Run Code Online (Sandbox Code Playgroud)
问题是ThreadPoolExecutor使用自己的Thread来运行你的任务,它会中断这个线程而不是你的.扩展Thread是没有意义的,而是实现Runnable.如果您仍然使用Thread,那么您可以直接从MyThread.run()调用MyThread.interrupt()