私が持っているコードは Callable インスタンスを作成し、 ExecutorService を使用して新しいスレッドが作成されています。スレッドの実行が完了していない場合、一定時間後にこのスレッドを強制終了したいと思います。jdk のドキュメントを読んだ後、Future.cancel() メソッドを使用してスレッドの実行を停止できることに気付きましたが、残念ながら機能していません。もちろん、 future.get() メソッドは、規定の時間 (私の場合は 2 秒) 後にスレッドに割り込みを送信しており、スレッドでさえこの割り込みを受信していますが、この割り込みは、スレッドが実行を終了した後にのみ発生します。完全に。しかし、2秒後にスレッドを殺したいです。
これを達成する方法を教えてください。
テストクラス コード:
====================================
public class TestExecService {
public static void main(String[] args) {
//checkFixedThreadPool();
checkCallablePool();
}
private static void checkCallablePool()
{
PrintCallableTask task1 = new PrintCallableTask("thread1");
ExecutorService threadExecutor = Executors.newFixedThreadPool(1);
Future<String> future = threadExecutor.submit(task1);
try {
System.out.println("Started..");
System.out.println("Return VAL from thread ===>>>>>" + future.get(2, TimeUnit.SECONDS));
System.out.println("Finished!");
}
catch (InterruptedException e)
{
System.out.println("Thread got Interrupted Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
//e.printStackTrace();
}
catch (ExecutionException e)
{
System.out.println("Thread got Execution Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
}
catch (TimeoutException e)
{
System.out.println("Thread got TimedOut Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
future.cancel(true);
}
threadExecutor.shutdownNow();
}
}
呼び出し可能なクラス コード:
===================================================================
package com.test;
import java.util.concurrent.Callable;
public class PrintCallableTask implements Callable<String> {
private int sleepTime;
private String threadName;
public PrintCallableTask(String name)
{
threadName = name;
sleepTime = 100000;
}
@Override
public String call() throws Exception {
try {
System.out.printf("%s going to sleep for %d milliseconds.\n", threadName, sleepTime);
int i = 0;
while (i < 100000)
{
System.out.println(i++);
}
Thread.sleep(sleepTime); // put thread to sleep
System.out.printf("%s is in middle of execution \n", threadName);
} catch (InterruptedException exception) {
exception.printStackTrace();
}
System.out.printf("%s done sleeping\n", threadName);
return "success";
}
}