3

我必须做功课,我已经完成了一些代码,但有一些问题:

必须在 java 中创建一个 boss-workers 应用程序。

  1. 我有这些课程:Main WorkerThread BossThread Job

基本上我想做的是,BossThread持有 aBlockingQueue并且工人去那里寻找Jobs.

问题一:

目前我开始 5WorkingThreads和 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();

老板线程:

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;
    }
}
4

1 回答 1

1

首先,我注意到一个重要错误:

BossThread thread = new BossThread(jobs, workers));
thread.run();

Runnables 必须传递给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都由执行者自动处理。

于 2012-09-27T11:56:50.597 回答