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에 .
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()를 사용하여 이러한 유형의 시나리오를 처리하려면 어떻게 해야 합니까?
- 작업 코드(실행 가능 또는 호출 가능 구현)를 try{} catch{} 블록 코드에 포함
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직접적으로.
완전한 답변은 여기에 게재된 두 가지 답변(및 약간의 "추가")으로 구성됩니다.
- (실행이 아닌) 작업을 제출하면 결과를 가져오거나 작업을 취소하는 데 사용할 수 있는 미래를 얻을 수 있습니다.이런 종류의 제어가 안 되는데
executeID(「ID」)이기 에)void) executeRunnable동시에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
'programing' 카테고리의 다른 글
| JavaScript 비교에 사용해야 하는 연산자(== 대 ===)는 무엇입니까? (0) | 2022.09.19 |
|---|---|
| mysqlsh: 덤프 파일 Import 방법 (0) | 2022.09.19 |
| try-finally와 try-catch의 차이 (0) | 2022.09.18 |
| Zend Framework를 사용한 MariaDB로의 전환 (0) | 2022.09.18 |
| SQL Server 데이터베이스를 MySQL로 내보내는 방법 (0) | 2022.09.18 |