Java 具有共享队列的执行器
我有一个任务生成器和几个硬件资源来执行它们 所以,我尝试使用共享队列创建执行器Java 具有共享队列的执行器,java,concurrency,Java,Concurrency,我有一个任务生成器和几个硬件资源来执行它们 所以,我尝试使用共享队列创建执行器 BlockingQueue<Runnable> queue; ExecutorService executor1 = new ThreadPoolExecutor(poolSize1, poolSize1, 0L, TimeUnit.MILLISECONDS, queue, threadFactory); ExecutorService executor2 = new ThreadPoolExecutor
BlockingQueue<Runnable> queue;
ExecutorService executor1 = new ThreadPoolExecutor(poolSize1, poolSize1, 0L, TimeUnit.MILLISECONDS, queue, threadFactory);
ExecutorService executor2 = new ThreadPoolExecutor(poolSize2, poolSize2, 0L, TimeUnit.MILLISECONDS, queue, threadFactory);
ExecutorService executor3 = new ThreadPoolExecutor(poolSize3, poolSize3, 0L, TimeUnit.MILLISECONDS, queue, threadFactory);
阻塞队列;
ExecutorService Executor 1=新的ThreadPoolExecutor(poolSize1、poolSize1、0L、TimeUnit.millides、queue、threadFactory);
ExecutorService Executor 2=新的ThreadPoolExecutor(poolSize2,poolSize2,0L,TimeUnit.millides,queue,threadFactory);
ExecutorService executor3=新的ThreadPoolExecutor(poolSize3,poolSize3,0L,TimeUnit.millides,queue,threadFactory);
并且(只需尝试)将任务添加到队列中。放置(任务),而不是特定的执行者n.execute(任务)
但是,execurer直到调用execute(task)才创建线程
那么,我需要一个执行器的实现?在子执行器的任何空闲线程上运行任务。
也许您知道可以使用的解决方案/库
这不是一个平衡器。我不管任务从哪里开始。让它在队列中等待,直到它被一个免费的处理程序接受为止我希望您手动实现它:
BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(500);
IntStream.range(0, 10).forEach(i -> {
Thread t = new Thread(() -> {
while (true) {
try {
queue.take().run();
} catch (InterruptedException e) {
break;
}
}
});
t.setDaemon(true);
t.setName("worker-"+i);
t.start();
});
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
Thread.sleep(1000);
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
Thread.sleep(1000);
附加线程将等待队列中的新项目。我希望您手动实现它:
BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(500);
IntStream.range(0, 10).forEach(i -> {
Thread t = new Thread(() -> {
while (true) {
try {
queue.take().run();
} catch (InterruptedException e) {
break;
}
}
});
t.setDaemon(true);
t.setName("worker-"+i);
t.start();
});
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
Thread.sleep(1000);
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
queue.add(() -> System.out.println(Thread.currentThread().getName()));
Thread.sleep(1000);
p.S.线程将等待队列中的新项目。这不是您想要实现的目标吗?为什么需要几个执行器?“几个硬件资源”应该转换为几个工作线程,而不是executors@talex,我有以前由一个远程处理程序执行的任务,现在它的资源不足,我想如何通过添加更多服务器来增加容量。@Sharon Ben Asher,将逻辑移到ThreadFactory是个好主意。@lunicon在这种情况下,您可以使用Matthew Ivanoff答案中的想法。这不是您想要实现的目标吗?为什么需要几个执行器?“几个硬件资源”应该转换为几个工作线程,而不是executors@talex,我有以前由一个远程处理程序执行的任务,现在它的资源不足,我想如何通过添加更多服务器来增加容量。@Sharon Ben Asher,将逻辑移到ThreadFactory是个好主意。@lunicon在这种情况下,您可以使用Matthew Ivanoff answer中的idea。您的解决方案假定您需要立即创建所有线程。ExecutorService仅在没有足够的空闲线程时创建这些线程。您的解决方案假定您需要立即创建所有线程。ExecutorService仅在没有足够的免费服务时创建它们。