スレッド(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)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(Callabe
例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を使用することを推奨する.
Reference
この問題について(スレッド(thread)-(4)), 我々は、より多くの情報をここで見つけました https://velog.io/@namgeon1106/스레드thread-4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol