带Boss Worker的Java线程
我必须做功课,我已经完成了一些代码,但有一些问题: 必须用java创建boss workers应用程序。带Boss Worker的Java线程,java,multithreading,runnable,blockingqueue,Java,Multithreading,Runnable,Blockingqueue,我必须做功课,我已经完成了一些代码,但有一些问题: 必须用java创建boss workers应用程序。 我有以下类:Main WorkerThread BossThread Job 基本上,我想做的是,BossThread持有一个BlockingQueue,工作人员去那里寻找作业 问题1: 此时,我启动了5个工作线程和1个BossThread 主要内容: 首先,我注意到一个重要错误: BossThread thread = new BossThread(jobs, workers)); thr
Main WorkerThread BossThread Job
BossThread
持有一个BlockingQueue
,工作人员去那里寻找作业
问题1:
此时,我启动了5个工作线程和1个BossThread
主要内容:
首先,我注意到一个重要错误:
BossThread thread = new BossThread(jobs, workers));
thread.run();
Runnable
s必须传递给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());
}
类作业实现可运行{
公开募捐{
//工作
}
}
...
//创建包含5个线程和阻塞队列的线程池
ExecutorService exec=Executors.newFixedThreadPool(5);
//提交一些工作
对于(int i=0;i<10;i++){
执行提交(新作业());
}
就这样!所有的put
和take
都是由执行器自动处理的。我会使用ExecutorService
它将队列与线程池结合起来,并将替换大部分代码。但是我的BossThread实现了Runnable,当我将run改为start时,我得到:方法start()对于类型BossThread
@Jaanus,未定义:请参阅开头的“我的编辑”。这意味着您没有正确启动线程。您需要将Runnable
传递给Thread
对象。我的作业必须实现Runnable吗?目前,只有类才能使用方法doWork()
,实现runnable的只有bossthread和workerthread。此外,Workerthreads似乎每个都有这样的单独队列,而不是与boss共享队列。@Jaanus:如果使用ExecutorService
,它必须实现Runnable
。submit
方法需要一个Runnable
。只有一个共享队列与ExecutorService
,就像您的情况一样。但由于这是我的功课,我想我必须自己实现一些事情,而不是使用该服务。所以在我的示例中,似乎每个工人都有一个队列,但我需要他们只使用一个队列。
BossThread thread = new BossThread(jobs, workers));
thread.run();
Thread thread = new Thread(new BossThread(jobs, workers)));
thread.start();
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());
}