Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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线程池执行器释放线程到线程池_Java_Scala_Executor - Fatal编程技术网

Java线程池执行器释放线程到线程池

Java线程池执行器释放线程到线程池,java,scala,executor,Java,Scala,Executor,我有以下Runnable.run()方法: 我希望在线程池执行器中以最大线程数执行此代码 现在回答我的问题: 假设我的线程池由5个线程组成。在当前示例中,5个runnables会阻止任何其他线程的执行,因为Thread.sleep()不会释放线程?!(如果IO未成功) 有没有办法释放线程而不是使用thread.sleep(),这样其他可运行程序就可以在另一个正在等待IO的时候开始执行 因此,在最坏的情况下,所有可运行程序都将处于while循环中?如果您的I/O工作被阻塞,那么您别无选择:线程必须

我有以下Runnable.run()方法:

我希望在线程池执行器中以最大线程数执行此代码

现在回答我的问题:

假设我的线程池由5个线程组成。在当前示例中,5个runnables会阻止任何其他线程的执行,因为Thread.sleep()不会释放线程?!(如果IO未成功)

有没有办法释放线程而不是使用thread.sleep(),这样其他可运行程序就可以在另一个正在等待IO的时候开始执行


因此,在最坏的情况下,所有可运行程序都将处于while循环中?

如果您的I/O工作被阻塞,那么您别无选择:线程必须坐在堆栈上等待阻塞I/O完成,这样线程就不能做任何其他工作

您想要的是使用非阻塞I/O,结合番石榴之类的东西。这将使您能够执行以下操作:

static ListenableFuture doIoWork(){
// ...
}
静态ListenableFuture doIoWithRetry(
ListingExecutor(服务执行器){
SettableFuture finalResult=SettableFuture.create();
calculateStuff();
doIoWithRetry(执行者,最终结果);
返回最终结果;
}
私有静态void doIoWithRetry(
最终列表执行器服务执行器,
最终设置表(未来最终结果){
最终列出的未来pendingWork=doIoWork();
pendingWork.addListener(新的Runnable(){
@重写公共无效运行(){
//悬而未决的工作现已完成
//(此处省略了错误检查)
boolean ioSuccessful=pendingWork.get();
如果(失败){
最终结果集(真);
返回;
}
doIoWithRetry(执行者,最终工作);
}
},遗嘱执行人);
}

您知道在java或scala中使用核心库是否可以实现同样的效果吗?
public void run() {
    calculateStuff();
    boolean ioSuccesful = IOforThisRunnable();   
    while(!ioSuccesful ) {
        Thread.sleep(500);   // alternative?
        boolean ioSuccesful = IOforThisRunnable();
    }  
}