スレッド(thread)-(4)


スレッドプール-part 2


タスクの作成


RunnableまたはCallableインタフェースの実装オブジェクトとして表示されます.Runnableにはrunメソッドの戻り値は存在せず,Callableには存在する.スレッドプール内のスレッドは、runメソッドとcallメソッドを実行するためにワークキューからRunnableオブジェクトまたはCallableオブジェクトを取得します.
Runnable task = new Runnable(){
    @Override
    public void run(){
        // 작업 내용
    }
}

Callable<T> task = new Callable<T> {
    @Override
    public T call() throws Exception{
        // 스레드가 처리할 작업 내용
        return T;
    }
}

タスク処理要求


これは、実行不可能で呼び出し可能なオブジェクトをExecuterServiceのワークキューに入れることを意味します.このため、ExecuterServiceでは、次の方法を使用できます.
メソッドは、void execute(Runnable command)がRunnableオブジェクトをワークキューに格納することを示します.ジョブ処理結果が受信できませんFuture コミット(Runnable task)FutureSubmit(Runnable task,V result)FutureSubmit(呼び出し可能V>Task)実行可能、呼び出し可能なオブジェクトがワークキューに格納されます.戻るFutureでタスク処理結果を得ることができます.

完全なオブジェクト


Futureは、作業結果ではなく、遅延完了(Pending Completion)オブジェクトです.submitを呼び出すとすぐに返されるのはFutureオブジェクトで、Futureのget()を使用して結果が現れるのを待つ(ブロック)ことで、最終結果を得ることができます.
方法V get()操作が完了する前にブロックされ、処理結果VがV get(long timeout,TimeUnit unit)timoutに戻る時間が完了した後、V戻り操作が完了しない場合、TimeoutExceptionが励起される
メソッドget呼び出し時に戻りタイプ操作を処理中に異常submit(Runnable task)nullfutureが発生します.get()->異常時submit(Runnable task,V result)V値future.get()->異常値submit(Callabetask)V future.get()->異常発生

例1。submit(Runnable task)

Runnable task = new Runnable(){
    @Override
    public void run(){
        // 작업 내용
    }
}

Future future = executorService.submit(task);

try{
    future.get(); // 블로킹 상태
}catch(InterruptedException e){
    // 작업 처리 도중 스레드가 interrupt될 경우 실행
}catch(ExecutionException e){
    // 작업 처리 도중 예외 발생 시 실행
}

例2。submit(Callable<V> task)

Callable<Integer> task = new Callable<Integer>(){
    @Override
    public T call throws Exception{
        // 작업 코드
        return T;
    }
}

Future<Integer> future = executorService.submit(task);

try{
    int result = future.get(); // 블로킹 상태
}catch(InterruptedException e){
    // 작업 처리 도중 스레드가 interrupt될 경우 실행
}catch(ExecutionException e){
    // 작업 처리 도중 예외 발생 시 실행
}

例3。submit(Runnable task, V result)


ジョブ処理結果を外部オブジェクトに保存する方法.通常、2つ以上のスレッドをマージする操作に使用されます.
class Task implements Runnable{
    Result result;
    
    Task(Result result){
        this.result = result;
    }
    
    @Override
    public void run(){
        // 작업코드
        // 처리결과는 result에 저장
    }
}

public static void main(){
    Result result = ???;
    Runnable task = new Task(result);
    
    Future<Result> future = executorService.submit(task, result);
    result = future.get();
}

その他の方法


方法説明boolean my interruptIfRunning(ブールキャンセル)操作を処理している場合、キャンセルしたboolean isCancel()操作がキャンセルされたかどうか、boolean isDone()操作が完了したかどうか

タスク処理中に異常が発生した場合の動作


execute()


スレッドが終了し、削除されます.これにより、ねじプールに新しいねじが作成され、他の操作が処理されます.

submit()


スレッドは終了せず、次のタスクを実行するために再使用されます.スレッド再生にはCPUが関与し,メモリも再割り当てが必要であるため,タスクの処理を要求する際にはできるだけsubmitを使用することを推奨する.