実装方法の簡単なネジを固定した数のワーカスレッド
-
02-07-2019 - |
質問
いため、最もシンプルに、もっとも簡単な方法の実施の
- 本プログラムinstantiates労働者 スレッドを行う課題です。
- のみ
n
タスクを走らせることになります。 - 時
n
に達した、労働者の 開始までの数 実行中のスレッドたちの生活を振り返以下n
.
解決
ると思い 執行者.newFixedThreadPool fitsの方法で購入できます。が異なる使い方のExecutorServiceるのかによって、いい結果を返しメインスレッドかのタスクは完全に自己含まれる、持っているかどうかを収集作業を行うフロントかどうか、タスクキューに対応一部のイベントです。
Collection<YourTask> tasks = new ArrayList<YourTask>();
YourTask yt1 = new YourTask();
...
tasks.add(yt1);
...
ExecutorService exec = Executors.newFixedThreadPool(5);
List<Future<YourResultType>> results = exec.invokeAll(tasks);
さくなければなりません。い新しい非同期タスクの実行に対応一部のイベントは終了いたしました。するとともに使用したいのですが、ExecutorServiceシンプル execute(Runnable)
方法。
他のヒント
/* Get an executor service that will run a maximum of 5 threads at a time: */
ExecutorService exec = Executors.newFixedThreadPool(5);
/* For all the 100 tasks to be done altogether... */
for (int i = 0; i < 100; i++) {
/* ...execute the task to run concurrently as a runnable: */
exec.execute(new Runnable() {
public void run() {
/* do the work to be done in its own thread */
System.out.println("Running in: " + Thread.currentThread());
}
});
}
/* Tell the executor that after these 100 steps above, we will be done: */
exec.shutdown();
try {
/* The tasks are now running concurrently. We wait until all work is done,
* with a timeout of 50 seconds: */
boolean b = exec.awaitTermination(50, TimeUnit.SECONDS);
/* If the execution timed out, false is returned: */
System.out.println("All done: " + b);
} catch (InterruptedException e) { e.printStackTrace(); }
Executor executor = Executors.newFixedThreadPool(n);
Runnable runnable = new Runnable() {
public void run() {
// do your thing here
}
}
executor.execute(runnable);
利用のExecutorの枠組み;すなわち newFixedThreadPool(N)
場合はタスクキューがいる限り、業務が完了するまでに短い時間間隔で利用できる
Executors.newFixedThreadPool(n)
;とを示唆する。唯一の欠点でこのソリューションは無制限のタスクキューサイズです。いて制御できます。の大きな積するタスクキューの劣化性能の適用に影響を与える可能性がありのメモリの一部ざいます。
使用する場合
ExecutorService
とをwork stealing
機構がアイドルワーカースレッドの作業負荷から忙しい作業者のスレッドを盗みタスクのタスクキューに挿入しますに戻りまForkJoinPoolタイプの実施者サービスです。public static
ExecutorService newWorkStealingPool
(int平行度)スレッドプールを作成しますの維持に十分なスレッドへの支援、指定された並列性のレベルは、複数の列を削減対立を生んでいる。並列処理のレベルに対応する最大数のスレッドを積極的に従事し、又は利用を行い、タスク処となります。実際のスレッド数が伸び縮みます。ワークを盗みプールを保証するものではありません、注文を提出したタスクが実行されます。
ります。
ThreadPoolExecutor
による柔軟性を管理するApiの多くのparatmetersると、制御の流れをタスクを実行します。ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
このケースではセットの両方 corePoolSize and maximumPoolSize as N
.ここでは制御タスクキューのサイズの定義およびユーザーインターフェイスのスレッド工場および拒絶反応のハンドラ。
見て関連SE問題を制御するプールサイズを動的に:
したい場合はロール自:
private static final int MAX_WORKERS = n;
private List<Worker> workers = new ArrayList<Worker>(MAX_WORKERS);
private boolean roomLeft() {
synchronized (workers) {
return (workers.size() < MAX_WORKERS);
}
}
private void addWorker() {
synchronized (workers) {
workers.add(new Worker(this));
}
}
public void removeWorker(Worker worker) {
synchronized (workers) {
workers.remove(worker);
}
}
public Example() {
while (true) {
if (roomLeft()) {
addWorker();
}
}
}
が労働者がクラスを拡張。各ワーカー着このクラスのremoveWorker方法、そしてパラメータが入っていることが多いので、終わっているのはいいですね。
ということで、Executorの枠組みに見えくります。
編集:誰でもケアなのか、理由を説明しうるだけではなく、downmoddingのですか?
その他の人がここに先ほども少し触れましたが、最良のベットはスレッドプールの 執行者 クラス:
しかし、だいたいロールを自分のこのコードを渡してくれる方を教えてください。基本的には、追加毎に新しいスレッドのスレッドグループに確認しておいて以Nアクティブスレッドグループ:
Task[] tasks = getTasks(); // array of tasks to complete
ThreadGroup group = new ThreadGroup();
int i=0;
while( i<tasks.length || group.activeCount()>0 ) {
if( group.activeCount()<N && i<tasks.length ) {
new TaskThread(group, tasks[i]).start();
i++;
} else {
Thread.sleep(100);
}
}