3

私は学業をしなければならず、いくつかのコードを完成させましたが、いくつか質問があります:

java で Boss-Workers アプリケーションを作成する必要があります。

  1. 私はこれらのクラスを持っています:Main WorkerThread BossThread Job

基本的に私がやりたいことは、それが a をBossThread保持しBlockingQueue、ワーカーがそこに行って を探すことですJobs

質問1:

現時点では 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;
}

これは正常ですか、それとも自分で作成する必要がありますWorkerThreadsBossThread?

質問2:

ご覧のとおり、キューを each に与えていますがWorkerThread、それは合理的ですか、それともキューを 1 か所だけに保存​​できますか?

質問 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

まず、私が気づいた重要な間違いが 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 に答える