これは、Windows でのスリープによってメイン スレッドが一時停止され、バックグラウンド スレッドが処理される時代からの明らかに古いアドバイスです。古いスレッド化の概念はキューとして想像でき、フロント スレッドだけが処理時間を取得します。そのスレッドが保留になるとすぐに (Windows では sleep(1) で十分です)、現在のスレッドはキューの最後に置かれ、他のスレッドが処理されます。
ただし、最新の OS ではこれがまったく異なる方法で処理され、そのアドバイスは現在、マルチスレッドの不適切な実装の兆候です。Java には、スレッドの優先度を設定するオプションがあり、バックグラウンド スレッドを負荷の高い処理に簡単に使用できます。今日は、次のように実装します。
まず、優先度の低いスレッド用の ThreadFactory が必要です。
public class PriorityThreadFactory implements ThreadFactory {
protected final ThreadGroup allThreads;
public PriorityThreadFactory(final String name, final int priority, final boolean daemon) {
this.allThreads = new ThreadGroup(name);
this.allThreads.setMaxPriority(priority);
this.allThreads.setDaemon(daemon);
}
@Override
public Thread newThread(final Runnable r) {
return new Thread(this.allThreads, r);
}
}
次に ExecutorService を作成し、優先度を次のように設定しますThread.MIN_PRIORITY
。
final PriorityThreadFactory threadFactory = new PriorityThreadFactory("workers", Thread.MIN_PRIORITY, true);
final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), threadFactory);
最後に、任意の数のタスクを送信できます。タスクはバックグラウンドで処理され、UI スレッドなどの重要なスレッドをブロックしません。
executor.submit(new MyWorkerTask());