programing

ExecutorService의 제출과 ExecutorService의 실행 중 하나를 선택합니다.

sourcejob 2022. 9. 19. 23:32
반응형

ExecutorService의 제출과 ExecutorService의 실행 중 하나를 선택합니다.

반환된 값이 중요하지 않은 경우 Executor Service의 송신실행 중 하나를 선택해야 합니다.

둘 다 테스트해 본 결과 반환된 값 이외에는 차이가 없었습니다.

ExecutorService threadExecutor = Executors.newSingleThreadExecutor();
threadExecutor.execute(new Task());

ExecutorService threadExecutor = Executors.newSingleThreadExecutor();
threadExecutor.submit(new Task());

예외/오류 처리에는 차이가 있습니다.

execute()that some some some 를 한다.Throwable 야기하다UncaughtExceptionHandler★★★★★★★★★★★★★★★★의 경우Thread이치노 " " "UncaughtExceptionHandler은 「」, 「」를 합니다.Throwable를 " " "로 설정합니다.System.err커스텀 핸들러가 인스톨 되어 있지 않은 경우는, 가 기동됩니다.

a, a, 편Throwable됩니다.submit()를 묶습니다.ThrowableFuture에 대한 요구에서 나온 것이다.submit(). 에 전화하고 있습니다부르기get() 점에 있어서FutureExecutionException 원 the the the와 함께Throwable으로서(「」를 호출해 할 수 ).getCause() ExecutionException를 참조해 주세요.

실행:화재 및 통화 건망증에 사용

submit: 메서드 호출 결과를 검사하고 적절한 조치를 취하기 위해 사용합니다.Future에 .

javadocs에서

submit(Callable<T> task)

실행할 값 반환 작업을 제출하고 보류 중인 작업 결과를 나타내는 미래를 반환합니다.

Future<?> submit(Runnable task)

실행을 위해 실행 가능한 작업을 제출하고 해당 작업을 나타내는 미래를 반환합니다.

void execute(Runnable command)

앞으로 지정된 명령어를 실행합니다.이 명령어는 실행자의 재량에 따라 새 스레드, 풀링 스레드 또는 호출 스레드에서 실행할 수 있습니다.

.submit(). 한 try{} catch{}

코드 예:이 코드는 삼켜버린다.Arithmetic exception : / by zero.

import java.util.concurrent.*;
import java.util.*;

public class ExecuteSubmitDemo{
    public ExecuteSubmitDemo()
    {
        System.out.println("creating service");
        ExecutorService service = Executors.newFixedThreadPool(10);
        //ExtendedExecutor service = new ExtendedExecutor();
        service.submit(new Runnable(){
                 public void run(){
                    int a=4, b = 0;
                    System.out.println("a and b="+a+":"+b);
                    System.out.println("a/b:"+(a/b));
                    System.out.println("Thread Name in Runnable after divide by zero:"+Thread.currentThread().getName());
                 }
            });
        service.shutdown();
    }
    public static void main(String args[]){
        ExecuteSubmitDemo demo = new ExecuteSubmitDemo();
    }
}

출력:

java ExecuteSubmitDemo
creating service
a and b=4:0

가 same환 same same same same same same same same same same same same same same same로 됩니다.submit()execute ) : ( ) :

교체하다

service.submit(new Runnable(){

와 함께

service.execute(new Runnable(){

출력:

java ExecuteSubmitDemo
creating service
a and b=4:0
Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero
        at ExecuteSubmitDemo$1.run(ExecuteSubmitDemo.java:14)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)

submit()를 사용하여 이러한 유형의 시나리오를 처리하려면 어떻게 해야 합니까?

  1. 작업 코드(실행 가능 또는 호출 가능 구현)를 try{} catch{} 블록 코드에 포함
  2. CustomThreadPoolExecutor

새로운 솔루션:

import java.util.concurrent.*;
import java.util.*;

public class ExecuteSubmitDemo{
    public ExecuteSubmitDemo()
    {
        System.out.println("creating service");
        //ExecutorService service = Executors.newFixedThreadPool(10);
        ExtendedExecutor service = new ExtendedExecutor();
        service.submit(new Runnable(){
                 public void run(){
                    int a=4, b = 0;
                    System.out.println("a and b="+a+":"+b);
                    System.out.println("a/b:"+(a/b));
                    System.out.println("Thread Name in Runnable after divide by zero:"+Thread.currentThread().getName());
                 }
            });
        service.shutdown();
    }
    public static void main(String args[]){
        ExecuteSubmitDemo demo = new ExecuteSubmitDemo();
    }
}

class ExtendedExecutor extends ThreadPoolExecutor {

   public ExtendedExecutor() { 
       super(1,1,60,TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(100));
   }
   // ...
   protected void afterExecute(Runnable r, Throwable t) {
     super.afterExecute(r, t);
     if (t == null && r instanceof Future<?>) {
       try {
         Object result = ((Future<?>) r).get();
       } catch (CancellationException ce) {
           t = ce;
       } catch (ExecutionException ee) {
           t = ee.getCause();
       } catch (InterruptedException ie) {
           Thread.currentThread().interrupt(); // ignore/reset
       }
     }
     if (t != null)
       System.out.println(t);
   }
 }

출력:

java ExecuteSubmitDemo
creating service
a and b=4:0
java.lang.ArithmeticException: / by zero

반환 유형에 관심이 없다면 execute를 사용합니다.제출하는 거랑 똑같아 퓨처만 안 돌아오면 돼

Javadoc에서 가져온 내용:

★★submit 메서드 {@ Executor을(를) 확장합니다.execute}: 실행을 취소하거나 완료되기를 기다리는 데 사용할 수 있는 {@link Future}을(를) 생성하고 반환합니다.

개인적으로는 이그제큐트를 사용하는 것을 선호합니다.이것은 개인적인 취향의 문제이지만, 보다 선언적인 느낌이 들기 때문입니다.

것은, 「 」의 경우: 「 」의 경우.ExecutorService,.Executors.newSingleThreadedExecutor()는 입니다.ThreadPoolExecutor.

submit됩니다.AbstractExecutorService이그제큐트에 의해 /제공됩니다.ThreadPoolExecutor직접적으로.

완전한 답변은 여기에 게재된 두 가지 답변(및 약간의 "추가")으로 구성됩니다.

  • (실행이 아닌) 작업을 제출하면 결과를 가져오거나 작업을 취소하는 데 사용할 수 있는 미래를 얻을 수 있습니다.이런 종류의 제어가 안 되는데execute ID(「ID」)이기 에)void)
  • execute Runnable 동시에submit 중 수 Runnable ★★★Callable인수(양자의 차이에 대한 자세한 내용은 아래 참조)로 지정합니다.
  • execute되지 않은 를 던질 수 반면 되지 않은 예외는 즉시 사라집니다(체크되지 않은 예외는 사라집니다!!).submit결과적으로 반환되는 미래에 대한 모든 종류의 예외를 바인드합니다.또, 콜을 발신했을 경우에만,future.get()수 있는 은 'Drowable'의 입니다.ExecutionException이 오브젝트를 '이러다getCause()오리지널 '드로우 가능'을 돌려드립니다.

기타 (관련) 포인트:

  • submit에서는 결과를 use does 、 does does 、 does does does does does does이다를 사용할 수 .계속 사용할 수 있습니다.Callable<Void>)Runnable
  • 작업 취소는 인터럽트 메커니즘을 사용하여 수행할 수 있습니다.다음은 취소 정책을 구현하는 방법의 입니다.

요약하자면, 이 제품을 사용하는 것이 더 좋은 방법입니다.submit a Callable(vs.execute a RunnableBrian Goetz " "Java consurrities in practice" "" brian brian brian brian brian brian brian brian brian brian brian brian brian 。

6.3.2 성과가 있는 과제: 콜 가능성과 미래

Executor 프레임워크는 Runnable을 기본 태스크 표현으로 사용합니다.Runnable은 상당히 제한적인 추상화입니다.로그 파일에 쓰거나 공유 데이터 구조에 결과를 배치하는 등의 부작용이 있을 수 있지만 실행 시 값을 반환하거나 선택된 예외를 슬로우할 수 없습니다.데이터베이스 쿼리를 실행하거나 네트워크를 통해 리소스를 가져오거나 복잡한 함수를 계산하는 등 많은 작업이 효과적으로 지연됩니다.이러한 유형의 태스크에서 Callable은 더 나은 추상화입니다.주요 엔트리 포인트인 콜이 값을 반환하고 예외가 발생할 수 있다고 예상합니다.7실행 프로그램에는 Runnable 및 java.security를 비롯한 다른 유형의 태스크를 래핑하는 몇 가지 유틸리티 방법이 포함되어 있습니다.PrivilegedAction(콜 가능).

Javadoc에서:

이 명령어는 실행자의 재량에 따라 새 스레드, 풀링 스레드 또는 호출 스레드에서 실행할 수 있습니다.

,의 현, 현, 구, 구, 구, 구, so, so, so, so, so, so, so, soExecutor작업 실행 중에 송신 스레드가 차단될 수 있습니다.

그냥 받아들여진 대답에 더해서...

단, 태스크에서 발생하는 예외는 execute()를 사용하여 제출된 태스크에 대해서만 수집되지 않은 예외 핸들러로 간주됩니다.submit()를 사용하여 실행자 서비스에 제출된 태스크의 예외는 태스크 반환 상태의 일부로 간주됩니다.

원천

언급URL : https://stackoverflow.com/questions/3929342/choose-between-executorservices-submit-and-executorservices-execute

반응형