スレッドプール
1.スレッドプールとは何ですか
これは、マルチスレッドアプリケーションの初期化プロセス内のスレッドのセットを作成するために、スレッドプールのスレッドを再利用するために参照し、その後、新しいタスクを実行するのではなく、新しいスレッドを作成する必要があります。スレッドプール内のスレッドの数は、通常、使用可能なメモリの量やアプリケーションのニーズによって異なります。プール内の各スレッドは、タスクが完了すると、スレッドの後ろにプールし、一度割り当てられたタスクが待っている、タスクが割り当てられています。
2、スレッドプールの役割
①スレッドプールは、アプリケーションの応答時間を改善します。プール内のスレッドが準備してタスクを割り当てられるのを待っているように、アプリケーションは直接、新しいスレッドを使用せずに使用することができます。
各短いライフサイクルのタスクが完了したスレッド②スレッドプールを作成するには、タスクが完了した後の資源を回収することができます。
③スレッドプールスレッドのタイムスライスは、現在システム上で実行されるプロセスに応じて最適化されます。
④スレッドプールは、私たちは、各スレッドのプロパティを設定することなく、複数のタスクを開くことができます。
3、Javaは4つのスレッドプールを提供します
3.1、newCachedThreadPool
リサイクル可能でない場合は、治療が必要な場合は、柔軟性が、新しいスレッドをアイドル状態のスレッドを再利用するよりも長くキャッシュスレッドプール、スレッドプールを作成します。
public class CachedThreadPoolDemo {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newCachedThreadPool();
for (int i = 1; i <= 10; i++) {
final int index = i;
threadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "=====" + index);
}
});
}
}
}
3.2、newFixedThreadPool
固定長のスレッドプールを作成し、あなたが同時スレッドの最大数を制御することができ、余分なスレッドは、キュー内で待機します。
public class FixedThreadPoolDemo {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(3);
for (int i = 1; i <= 10; i++) {
final int index = i;
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + "=====" + index);
});
}
}
}
3.3、newScheduledThreadPool
定期的かつ定期的なタスクの実行をサポートするために、固定長のスレッドプールを作成します。
public class ScheduledThreadPoolDemo {
public static void main(String[] args) {
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(3);
for (int i = 1; i <= 10; i++) {
threadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ":延迟3秒打印log");
}
}, 3, TimeUnit.SECONDS);
}
}
}
3.4 newSingleThreadExecutor
シングルスレッドのスレッドプールを作成し、それはすべてのタスクが指定された順序で実行されることを保証するためにタスクを実行するための単一のスレッドでのみ動作します。
public class SingleThreadExecutorDemo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 1; i <= 10; i++) {
final int index = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "===" + index);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}