スレッド(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>() // 작업 큐
);

スレッドプールを終了


スレッドプール内のスレッドは基本的にデーモンスレッドではないため、スレッドプールを終了してスレッドを終了する必要があります.