繁体   English   中英

与Boss-Worker的Java线程

[英]Java Threads with Boss-Worker

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

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

  1. 我有这些课程: 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;
}

这是正常的,或者我应该创建WorkerThreadsBossThread

问题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());
}

就是这样! 所有puttake东西都由执行程序自动处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM