[英]Java Threads with Boss-Worker
我必须做功课,我已完成一些代码,但有一些问题:
必须在java中创建一个boss-workers应用程序。
Main WorkerThread BossThread Job
基本上我想要做的是, BossThread
持有BlockingQueue
并且工作人员去那里寻找Jobs
。
问题1:
目前,我开始5个WorkingThreads
和1个BossThread
。
主要:
Collection<WorkerThread> workers = new ArrayList<WorkerThread>();
for(int i = 1; i < 5; i++) {
WorkerThread worker = new WorkerThread();
workers.add(worker);
}
BossThread thread = new BossThread(jobs, workers);
thread.run();
BossThread:
private BlockingQueue<Job> queue = new ArrayBlockingQueue<Job>(100);
private Collection<WorkerThread> workers;
public BossThread(Set<Job> jobs, Collection<WorkerThread> workers) {
for(Job job : jobs) {
queue.add(job);
}
for(WorkerThread worker : workers) {
worker.setQueue(queue);
}
this.workers = workers;
}
这是正常的,或者我应该创建WorkerThreads
我BossThread
?
问题2:
如您所见,我将队列分配给每个WorkerThread
,这是合理的还是我只能将队列存储在一个地方?
问题3:
我必须以某种方式保持我的BossThread
运行,只是等待用户添加更多东西到队列? 我如何让WorkerThreads
继续运行,从队列中寻找工作?
任何整体建议或设计缺陷或建议?
public class WorkerThread implements Runnable {
private BlockingQueue<Job> queue;
public WorkerThread() {
}
public void run() {
try {
queue.take().start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void setQueue(BlockingQueue<Job> queue) {
this.queue = queue;
}
}
首先,我注意到一个重要的错误:
BossThread thread = new BossThread(jobs, workers));
thread.run();
必须将Runnable
传递给Thread
对象,并且使用start
线程,而不是run
。 通过调用run
您可以在同一个线程上执行顺序执行。 所以:
Thread thread = new Thread(new BossThread(jobs, workers)));
thread.start();
其次,除非你绝对必须使用BlockingQueue
和显式线程,否则我会使用ExecutorService
。 它巧妙地封装了一个阻塞工作队列和一组工人(你可以设置它们的大小)。 这基本上就是你正在做的事情,但使用起来更简单:
class Job implements Runnable {
public void run() {
// work
}
}
...
// create thread pool with 5 threads and blocking queue
ExecutorService exec = Executors.newFixedThreadPool(5);
// submit some work
for(int i = 0; i < 10; i++) {
exec.submit(new Job());
}
就是这样! 所有put
和take
东西都由执行程序自动处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.