Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自Callable的线程处于等待状态。我该如何终止线程?_Java_Multithreading_Callable - Fatal编程技术网

Java 来自Callable的线程处于等待状态。我该如何终止线程?

Java 来自Callable的线程处于等待状态。我该如何终止线程?,java,multithreading,callable,Java,Multithreading,Callable,有很多类似的问题,但没有解决方案对我有效 我有一个需要运行一定时间的Callable。在调用方法的执行过程中,它必须在while条件下定期执行一些检查,以检查是否必须保持运行。我还希望能够停止来自外部的可调用(API调用) 下面的代码是一个简化版本,但存在相同的问题: 当可调用线程返回时,线程将保持等待状态。如何终止此线程? 公共类MyCallable实现可调用{ 私有AtomicBoolean停止=新的AtomicBoolean(false); @凌驾 公共Foo call(){ System

有很多类似的问题,但没有解决方案对我有效

我有一个需要运行一定时间的Callable。在调用方法的执行过程中,它必须在while条件下定期执行一些检查,以检查是否必须保持运行。我还希望能够停止来自外部的可调用(API调用)

下面的代码是一个简化版本,但存在相同的问题:

当可调用线程返回时,线程将保持等待状态。如何终止此线程?

公共类MyCallable实现可调用{
私有AtomicBoolean停止=新的AtomicBoolean(false);
@凌驾
公共Foo call(){
System.out.printf(“ID为%d的新线程”,
Thread.currentThread().getId());
Foo-Foo=新的Foo();
而(!stop.get()){
试一试{
Thread.sleep(1000);//在再次执行检查之前先睡一段时间
}捕捉(中断异常e){
}
}
System.out.printf(“返回foo之前的状态:%s\n”,
Thread.currentThread().getState());
返回foo;
}
公共停车场(){
this.stop.set(true);
}
}
公共类主{
公共静态void main(字符串[]args)引发InterruptedException{
MyCallable MyCallable=新的MyCallable();
ExecutorService ExecutorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
Future=executorService.submit(myCallable);
打印线程();
System.out.println(“调用停止\n”);
myCallable.stop();
而(!future.isDone()){
睡眠(200);
}
System.out.println(“未来完成后:”);
打印线程();
}
//辅助方法
私有静态void printThreads(){
List threads=Thread.getAllStackTraces().keySet()
.stream()
.filter(t->t.getName().contains(“池”))
.collect(Collectors.toList());
threads.forEach(t->System.out.printf(“ID=%s STATE=%s\t\n”,t.getId(),t.getState());
System.out.println();
}
}
这是程序的输出


您不需要手动终止由
ExecutorService管理的线程。您需要优雅地关闭服务,它将终止其线程

executorService.shutdown();

通常,线程工作线程不会在单个任务完成后终止。它被移动到
等待
状态,直到出现新任务。这些东西由执行器服务管理。关闭它将导致终止它负责的线程

谢谢,这很有效!附加问题:在我的实际应用程序中,我为每个请求(每个新的可调用)创建一个新的ExecutorService。这是一个好方法吗?@senneverhagen我觉得这样做会违背服务的目的。它是用来管理运行哪些东西的,为每个可调用对象创建一个实例难道不就像自己不受管理地运行它们一样吗?@senneverhagen通常一个
ExecutorService
的实例就足够了。创建它一次,共享它,并在每次需要提交任务时重用它。