java - 如何等待 ExecutorService 中的一个正在运行的线程完成分配另一个任务
问题描述
我有将任务分配给具有固定大小线程的 ExecutorService 的循环,我希望主程序等待threadPool 释放它的一个线程以分配另一个任务给它。
这是我的示例代码:在此示例代码中,我想finished!
在最后打印并希望使用 ExecutorService。
public static void main(String[] args) {
ExecutorService ex = Executors.newFixedThreadPool(3);
for(int i=0; i< 100; i++) {
ex.execute(new TestThread(i)); // I want the program wait here for at least one thread to free
}
System.out.println("finished!");
}
private static class TestThread implements Runnable {
private int i;
public TestThread(int i) {
this.i = i;
}
@Override
public void run() {
System.out.println("hi: " + i);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
解决方案
我了解您希望提交作业的线程在执行程序服务中没有免费、随时可用的工作线程时阻塞。这对于施加背压很有用。
执行器服务的核心是“简单地”由一个可运行队列和一个工作线程池组成。
您可以通过构建具有固定大小的工作队列(在您的情况下为大小一)的执行程序服务来获得此行为。
在代码中:(请注意,您的调用者线程在提交最后一个作业后仍将继续;它不会等待该作业完成)
package stackOv;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class BackPressure {
public static void main(String[] args) {
// this is the backing work queue; in this case, it is of bounded size
ArrayBlockingQueue<Runnable> q = new ArrayBlockingQueue<>(1);
ExecutorService ex = new ThreadPoolExecutor(3, 3, 30, TimeUnit.SECONDS, q,
new ThreadPoolExecutor.CallerRunsPolicy());
for(int i=0; i< 100; i++) {
ex.execute(new TestWork(i));
}
System.out.println("finished!");
}
private static class TestWork implements Runnable {
private int i;
public TestWork(int i) {
this.i = i;
}
@Override
public void run() {
System.out.println("hi: " + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
推荐阅读
- ios - 在iphone中打开谷歌地图不起作用
- html - 如何防止 Nutch / Solr 索引菜单或其他 html 内容?
- php - OpenConnect with Apigility 用 JWT 回答
- c++ - 全局变量中的静态 const 与 const
- html - 在 3x 3 网格系统中对齐引导卡
- javascript - 如何创建必须根据 $ID 更改的 javascript 结果 div
- excel - Excel求解器/opensolver找到城市之间的最短距离
- powershell - 带有设置文件的 AzCopy 的 Powershell 脚本
- python - 无法在 Web 服务器上执行 Python 脚本
- javascript - 反应复选框组/单个复选框