带Boss Worker的Java线程

带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

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

必须用java创建boss workers应用程序。

  • 我有以下类:
    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());
    }