可能重复:
ThreadPool 和 JobQueue
- Manager 将作业指定到作业队列中(队列大小不固定)。
- 线程由固定数量的 ThreadPool 维护。
- 每当作业队列中有作业时,Frame 将 ThreadPool 中的线程分配给作业。
- 如果队列中没有作业,那么线程需要等待作业到达。(重复第 3 步和第 4 步)
如果可能的话,我如何实现这些,也可以提及代码。
可能重复:
ThreadPool 和 JobQueue
如果可能的话,我如何实现这些,也可以提及代码。
您需要BlockingQueue
将您的任务排队并ExecutorService
与工作人员一起处理您的任务。
示例源代码:
final BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
queue.put("test");// Add item here
ExecutorService service = Executors.newFixedThreadPool(10);// specifynumber
// of thread
int numWorkers = 10;
for (int i = 0; i < numWorkers; i++) {
service.submit(new Runnable() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
String item = queue.take();
// Process item
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
break;
}
}
}
});
}
解释:
Manager 将作业指定到作业队列中(队列大小不固定)。
声明一个阻塞队列来保存你的 Job。String
type 在这里代表 Job。
final BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
线程由固定数量的 ThreadPool 维护。
ExecutorService
与FixedThreadPool
大小一起使用。
ExecutorService service = Executors.newFixedThreadPool(10);
每当作业队列中有作业时,Frame 将 ThreadPool 中的线程分配给作业。
使用操作将作业提交到队列put
。
queue.put("test");
使用take()
阻塞的操作
queue.take();//When there is job it will return the value else will get block
参考:
我会使用 ExecutorService 对您的任务进行排队并管理您的线程池。
Manager 将作业指定到作业队列中(队列大小不固定)。
向 ExecutorService 提交任务以处理每个作业,使用submit(Runnable)
线程由固定数量的 ThreadPool 维护。
AExecutors.newFixedThreadPool(n_threads)
是固定大小的线程池
每当作业队列中有作业时,Frame 将 ThreadPool 中的线程分配给作业。
ExecutorService 将在线程空闲时将它们分配给线程。
如果队列中没有作业,那么线程需要等待作业到达。
没有任务的线程是空闲的,对资源的影响很小。
如果您使用JDK 5 或更高版本,请使用 JDK 中的Executors 。您的作业是 Callable 接口的实现。ExecutorService 是执行器的外观。