スレッド(thread)-(3)
Daemonスレッド
プライマリ・スレッドの作業で補助的な役割を果たすスレッド.従属なので、メインスレッドが終了すると、デーモンスレッドも自動的に終了します.
ex)NAVERメール作成時自動保存機能
設定方法
マスタースレッドから、デーモンスレッドになるスレッドのsetDaemon(true)を呼び出します.startを呼び出す前に呼び出す必要があります.
public static void main(String[] args){
AutoSaveThread thread = AutoSaveThread();
thread.setDaemon(true);
thread.start();
// ...
}
ねじ組
その名の通り、複数のテーマが集まった組み合わせです.相互に関連付けられたスレッドをグループ化および管理するために使用され、スレッドグループは階層的にサブスレッドグループを持つことができる.
自動作成されたグループ
システムグループ
JVMの実行に必要なスレッドを含むグループ.
システム/メイングループ
プライマリ・スレッドを含むスレッド.
ねじは、基本的に作成されたねじグループに属するねじグループに含まれる必要があります.開発者がスレッドを作成するときに特定のスレッドグループに含まない場合、デフォルトではsystem/mainに属します.
ねじグループの作成
ThreadGroupクラスを使用して生成します.
// 생성자 목록
ThreadGroup(String name)
ThreadGroup(ThreadGroup parent, String name)
ThreadGroup(ThreadGroup parent, Runnable target, String name);
// 그룹을 생성하면서 스레드를 그룹에 포함
ThreadGroup(ThreadGroup parent, Runnable target, String name, long stackSize);
ねじグループ名
ThreadGroup gruop = Thread.currentThread.getThreadGroup();
String groupName = group.getName();
スレッドグループバッチ割込み
スレッドグループでinterrupt()が呼び出されると、割り込みメソッドはすべての属するスレッドに呼び出されます.
public static void main(String[] args) {
ThreadGroup mainGroup1 = Thread.currentThread().getThreadGroup();
String threadGruop1 = mainGroup1.getName();
System.out.println(threadGruop1);
ThreadGroup myGroup = new ThreadGroup("myGroup");
WorkThread workThreadA = new WorkThread(myGroup, "workThreadA");
WorkThread workThreadB = new WorkThread(myGroup, "workThreadB");
workThreadA.start();
workThreadB.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}
myGroup.interrupt();
// workThreadA, workThread B 종료됨
}
方法
スレッドプール
スレッド爆発
パラレル処理が多ければ多いほどスレッド数が多くなるため、スレッドの作成とスケジューリングが忙しくなり、メモリ使用量も増加します.これにより、アプリケーションのパフォーマンスが急激に低下します.
ねじプールの運動原理
スレッドプールは、タスクを処理するための有限スレッドを事前に生成します.処理が必要なタスクがワークキューに入ると、各スレッドは各タスクの処理を担当します.処理後、作業結果をアプリケーションに送信し、新しいタスクをワークキューから再取得および処理します.タスクリクエストが受信され続けても、スレッド数を増やすことなく、タスクキュー内のタスク数を増やすだけです.
ExecutorServiceインタフェース、Executorsクラス
どちらもjavautil.委託して提供する.Executorsの静的メソッドを使用して、Executorsのインプリメンテーションオブジェクトを作成できます.Javaでは、このインプリメンテーションオブジェクトがスレッドプールとして機能します.
ねじプールの作成方法
メソッド初期スレッド数コアスレッド数最大スレッド数newChachedTreadPool()00 Integer.MAX_VALUEnewFixedThreadPool(int nThreads)0nThreadsnThreads
初期スレッド数
スレッドプール生成時のスレッド数.
コアスレッド数
スレッドプールで少なくとも保持されているスレッドの数は、スレッド数がカーネルスレッド数より大きい場合、長時間使用しないスレッドはスレッドプールから削除されます.
最大スレッド数
スレッドプールが所有できる最大スレッド数.
newChachedThreadPool
int型の最高価格でスレッドを追加できますが、オペレーティングシステムやメモリの状況によって異なります.スレッドが60秒以内に何も実行されない場合は、追加したスレッドを終了し、プールから削除します.(コアスレッド数が0のため)
ExecutorService executorService = Executors.newChachedThreadPool();
newFixedThreadPool
nThread個のスレッドは、何も実行しなくても変わらない.
int nThread = Runtime.getRuntime().availableProcessors();
// CPU의 코어 수 반환
ExecutorService executorService = Executors.newFixedThreadPool(nThread);
ThreadPoolExecutor
newChachedThreadPool、newFixedThreadPoolメソッド操作によって生成されたThreadPoolExecutorオブジェクトを返します.
ExecutorService executorService = new ThreadPoolExecutor(
3, // 코어 스레드 수
100 // 최대 스레드 수
120L, // 작업하지 않는 스레드를 보존하는 시간
TimeUnit.SECONDS, // 시간 단위
new SynchronousQueue<Runnable>() // 작업 큐
);
スレッドプールを終了
スレッドプール内のスレッドは基本的にデーモンスレッドではないため、スレッドプールを終了してスレッドを終了する必要があります.
Reference
この問題について(スレッド(thread)-(3)), 我々は、より多くの情報をここで見つけました https://velog.io/@namgeon1106/스레드thread-3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol