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