如何等待 ExecutorService 中的 运行 个线程完成分配另一个任务
How to wait for one of the running threads in ExecutorService to finish to assign another task
我有一个将任务分配给具有固定大小线程的 ExecutorService 的循环,我希望 主程序等待 线程池释放它的一个线程以将另一个任务分配给它。
这是我的示例代码:在这个示例代码中,我希望 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();
}
}
}
您只需要:
ex.awaitTermination();
我知道您希望正在提交作业的线程在执行程序服务中没有空闲、随时可用的工作线程时阻塞。这对于施加背压很有用。
执行器服务的核心是 "simply" 由可运行队列和工作线程池组成。
您可以通过构建具有固定大小(在您的情况下为大小 1)的工作队列的执行程序服务来获得此行为。
在代码中:(请注意,您的调用线程在提交最后一个作业后仍将继续;它不会等待该作业完成)
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(); }
}
}
}
我有一个将任务分配给具有固定大小线程的 ExecutorService 的循环,我希望 主程序等待 线程池释放它的一个线程以将另一个任务分配给它。
这是我的示例代码:在这个示例代码中,我希望 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();
}
}
}
您只需要:
ex.awaitTermination();
我知道您希望正在提交作业的线程在执行程序服务中没有空闲、随时可用的工作线程时阻塞。这对于施加背压很有用。
执行器服务的核心是 "simply" 由可运行队列和工作线程池组成。
您可以通过构建具有固定大小(在您的情况下为大小 1)的工作队列的执行程序服务来获得此行为。
在代码中:(请注意,您的调用线程在提交最后一个作业后仍将继续;它不会等待该作业完成)
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(); }
}
}
}