실행 가능 대 자바 호출 가능

개요

자바 초기부터 멀티스레딩은 언어의 주요 측면이었다. 실행 가능한 멀티 스레드 작업을 표현하기 위해 제공되는 핵심 인터페이스이며,호출 자바 1.5 에 추가 된 실행의 개선 된 버전입니다.

이 기사에서는 두 인터페이스의 차이점과 응용 프로그램을 살펴 보겠습니다.

실행 메커니즘

두 인터페이스 모두 여러 스레드에서 실행할 수 있는 작업을 나타내도록 설계되었습니다. 실행 가능한 작업은 스레드 클래스 또는 실행기 서비스를 사용하여 실행할 수 있지만 호출은 후자를 사용하여 실행할 수 있습니다.

반환 값

이러한 인터페이스가 반환 값을 처리하는 방식을 자세히 살펴 보겠습니다.

3.1. 실행 가능한

에서 실행 가능한 인터페이스는 기능 인터페이스이며 매개 변수를 허용하지 않고 값을 반환하지 않는 단일 실행()메서드가 있습니다.

스레드 실행의 결과를 찾지 않는 상황(예:들어오는 이벤트 로깅)에 적합합니다:

public interface Runnable { public void run();}

예제를 통해 이해해 보겠습니다.:

public class EventLoggingTask implements Runnable{ private Logger logger = LoggerFactory.getLogger(EventLoggingTask.class); @Override public void run() { logger.info("Message"); }}

이 예에서 스레드는 큐에서 메시지를 읽고 로그 파일에 기록하기 만하면됩니다. 실행기 서비스를 사용하여 작업을 시작할 수 있습니다:

public void executeTask() { executorService = Executors.newSingleThreadExecutor(); Future future = executorService.submit(new EventLoggingTask()); executorService.shutdown();}

이 경우 미래의 객체는 어떤 값도 보유하지 않습니다.

3.2. 호출 가능한

에서 호출 가능한 인터페이스는 단일 호출()메서드를 포함하는 일반 인터페이스입니다.:

public interface Callable<V> { V call() throws Exception;}

숫자의 계승을 계산해봅시다:

public class FactorialTask implements Callable<Integer> { int number; // standard constructors public Integer call() throws InvalidParamaterException { int fact = 1; // ... for(int count = number; count > 1; count--) { fact = fact * count; } return fact; }}

호출 결과()메서드는 향후 개체 내에서 반환됩니다:

@Testpublic void whenTaskSubmitted_ThenFutureResultObtained(){ FactorialTask task = new FactorialTask(5); Future<Integer> future = executorService.submit(task); assertEquals(120, future.get().intValue());}

예외 처리

예외 처리에 얼마나 적합한 지 살펴 보겠습니다.

4.1. 실행 가능한

메서드 시그니처에”던지기”절이 지정되어 있지 않으므로 더 이상 확인 된 예외를 전파 할 수있는 방법이 없습니다.

4.2. 호출 가능한

호출 가능한 호출()메서드에는”예외 발생”절이 포함되어있어 확인 된 예외를 더 쉽게 전파 할 수 있습니다:

public class FactorialTask implements Callable<Integer> { // ... public Integer call() throws InvalidParamaterException { if(number < 0) { throw new InvalidParamaterException("Number should be positive"); } // ... }}

실행기 서비스를 사용하여 호출 가능을 실행하는 경우 향후 객체에서 예외가 수집되며 향후 호출하여 확인할 수 있습니다.가져 오기()방법. 이렇게 하면 원래 예외를 래핑하는 실행 예외가 발생합니다:

@Test(expected = ExecutionException.class)public void whenException_ThenCallableThrowsIt() { FactorialCallableTask task = new FactorialCallableTask(-5); Future<Integer> future = executorService.submit(task); Integer result = future.get().intValue();}

위의 테스트에서 실행 예외가 발생되고 있습니다. 이 예외 개체에 대한 메서드를 호출하여 원래 확인 된 예외를 가져올 수 있습니다.

우리는 미래의 클래스의 가져 오기()메소드에 대한 호출을하지 않는 경우-다음 호출()메소드에 의해 발생 예외가 다시보고되지 않으며,작업이 완료로 표시됩니다:

@Testpublic void whenException_ThenCallableDoesntThrowsItIfGetIsNotCalled(){ FactorialCallableTask task = new FactorialCallableTask(-5); Future<Integer> future = executorService.submit(task); assertEquals(false, future.isDone());}

위의 테스트는 우리가 인수 분해 계산 작업에 매개 변수의 음수 값에 대한 예외를 던진 경우에도 성공적으로 전달합니다.

결론

이 기사에서는 실행 가능한 인터페이스와 호출 가능한 인터페이스 간의 차이점을 살펴 보았습니다.

항상 그렇듯이 이 문서의 전체 코드는 깃허브에서 확인할 수 있습니다.

봄 학습 과정을 통해 봄 5 와 봄 부팅 2 를 시작하십시오:

>> 코스 확인

답글 남기기

이메일 주소는 공개되지 않습니다.

Previous post 니트릴
Next post 줄리안 모리스에서’소녀’=최상의 아이디어도