자바에서 호출 가능한 인터페이스를 구현하는 방법



이 기사는 예제와 함께 Java에서 호출 가능 인터페이스를 구현하는 방법에 대한 상세하고 포괄적 인 지식을 제공합니다.

자바 멀티 스레딩 프로그램은 부름과 미래. 스레드 및 멀티 스레딩에 대한 전제 조건 지식을 바탕으로 독자는이 기사에서 논의하는 내용을 더 잘 이해할 수 있습니다. 이 기사에서 Java의 Callable Interface에 대해 설명 할 것입니다.

스레드 요약

하지만 쓰레드의 개념에 대해 간단히 소개하겠습니다. 스레드는 별도의 실행 경로입니다. 반복적 인 작업을 수행해야하는 경우 작업을 여러 작업으로 나누어 스레드에 할당 할 수 있습니다. 멀티 스레딩결과를 빠르게 얻기 위해 병렬로 다른 작업을 실행하기 위해 여러 스레드를 할당하는 것입니다.





자바에서 호출 가능한 인터페이스 란?

Java 5의 경우 'java.util.concurrent'클래스가 도입되었습니다. 이 호출 가능한 인터페이스는 Runnable 인터페이스와 유사한 동시성 패키지를 통해 가져 왔습니다. 또한 모든 객체를 반환 할 수 있으며 Exception을 throw 할 수 있습니다. Java Callable 인터페이스는 Generics를 사용하므로 모든 유형의 객체를 반환 할 수 있습니다. Executor Framework는 스레드 풀에서 Callable 구현을 실행하는 submit () 메서드를 제공합니다. 실제로 Java Executor Framework는 WorkerThread 패턴을 따릅니다.

java-interface스레드 풀에서 사용자는 Executors.newFixedThreadPool (10) 메서드를 사용하여 스레드를 시작하고 이에 따라 작업을 제출할 수 있습니다. runnable은 스레드의 대상 역할을하며 public void run () 메서드는 작업을 정의하기 위해 의무적으로 구현됩니다. 이것은 스레드 풀의 스레드에 의해 실행됩니다. 풀에있는 스레드의 가용성에 따라 Executor Framework는 작업 (실행 가능한 대상)을 스레드에 할당합니다.모든 스레드가 사용 중이면 작업을 중단해야합니다. 스레드가 하나의 작업을 완료 한 후 사용 가능한 스레드로 풀로 돌아와 향후 작업을 수락 할 준비가되었습니다. Callable은 Runnable과 유사하며 작업에서 결과 또는 상태를 얻고 싶을 때 모든 유형의 객체를 반환 할 수 있습니다.



호출 가능한 인터페이스의 반환

Java Callable은 java.util.concurrent를 반환합니다. Java Future는 연관된 Callable 태스크를 제거하기 위해 cancel () 메소드를 제공합니다. 이것은 get () 메서드의 오버로드 된 버전으로, 결과를 기다리는 특정 시간을 지정할 수 있습니다. 더 오랜 기간 동안 차단 될 수있는 현재 스레드를 피하는 것이 유용합니다. get 메서드는 동기 메서드이며 콜 러블이 작업을 완료하고 값을 반환 할 때까지 콜 러블을 기다려야합니다.

연결된 Callable 작업의 현재 상태를 가져 오는 'isDone ()'및 'isCancelled ()'메서드도 있습니다. 1에서 100까지의 모든 숫자의 합계를 찾아야하는 예를 고려하십시오. 1에서 100까지 순차적으로 반복하고 마지막으로 추가 할 수 있습니다. 또 다른 가능성은 나누고 정복하는 것입니다. 이 방법에서는 각 그룹이 정확히 두 개의 요소를 갖도록 숫자를 그룹화 할 수 있습니다. 마지막으로 해당 그룹을 스레드 풀에 할당 할 수 있습니다. 따라서 각 스레드는 부분 합계를 병렬로 반환 한 다음 해당 부분 합계를 수집하고 추가하여 전체 합계를 얻습니다.

자바 원격 메소드 호출 예제



Callable 및 Future 클래스의 특징

  • 호출 가능 클래스는 SAM 유형 인터페이스이므로 람다 식으로 구현할 수 있습니다.

  • 호출 가능 클래스에는 비동기 적으로 실행하는 데 필요한 모든 코드를 보유하는 'call ()'메서드가 하나뿐입니다.

  • 실행 가능한 인터페이스 환경에서는 계산 결과를 반환하거나 확인 된 예외를 throw 할 가능성이 없습니다. Callable이 값을 반환하고 확인 된 예외를 던지는 반면에 사용할 수 있습니다.

  • Future 클래스의 Get () 메서드는 계산이 완료되면 결과를 검색하는 데 사용할 수 있습니다. 사용자는 done () 메서드를 사용하여 계산이 완료되었는지 여부를 확인할 수도 있습니다.

  • future.cancel () 메서드를 사용하여 계산을 취소하는 것도 일부 응용 프로그램에서 유용합니다.

  • Get ()은 차단 호출이라고하며 계산이 완료 될 때까지 계속 차단됩니다.

호출 가능 및 실행 가능 클래스 비교

호출 가능 실행 가능
' java.util.concurrent ' Java 1.5 이후 패키지Java 1.0 이후 java.lang 패키지의 일부입니다.
Callable과 같은 매개 변수화 된 인터페이스매개 변수화되지 않은 인터페이스
확인 된 예외를 던질 수 있음확인 된 예외를 throw 할 수 없습니다.
여기에는 Type V를 반환하는 단일 메서드 call ()이 포함되어 있으며 정의 된 인터페이스 매개 변수 'Type'과 동일합니다.여기에는 void를 반환하는 run ()이라는 단일 메서드가 포함되어 있습니다.

다음은 코드가 1 초 후에 작업을 실행하는 특정 스레드의 이름을 반환하는 Java 호출 가능 클래스의 간단한 예입니다. 여기서는 추출기 프레임 워크를 활용하여 제출 된 작업의 결과에 따라 Java Future와 병렬로 100 개의 작업을 실행합니다. 첫 번째 스 니펫은 출력이고 아래는 코드를 나타냅니다.

패키지 com.journaldev.threads import java.util.ArrayList import java.util.Date import java.util.List import java.util.concurrent.Callable import java.util.concurrent.ExecutionException import java.util.concurrent.ExecutorService import java .util.concurrent.Executors import java.util.concurrent.Future public class MyCallable implements Callable {@Override public String call () throws Exception {Thread.sleep (1000) //이 호출 가능한 작업을 실행하는 스레드 이름 반환 return Thread.currentThread () .getName ()} public static void main (String args []) {// Executors 유틸리티 클래스에서 ExecutorService 가져 오기, 스레드 풀 크기는 10 임 ExecutorService executor = Executors.newFixedThreadPool (10) // 미래를 보관할 목록 생성 호출 가능 목록과 연관된 객체목록 = 새 ArrayList() // MyCallable 인스턴스 생성 Callable callable = new MyCallable () for (int i = 0 i<100 i++){ //submit Callable tasks to be executed by thread pool Future future = executor.submit(callable) //add Future to the list, we can get return value using Future list.add(future) } for(Future fut : list){ try { //print the return value of Future, notice the output delay in console // because Future.get() waits for task to get completed System.out.println(new Date()+ '::'+fut.get()) } catch (InterruptedException | ExecutionException e) { e.printStackTrace() } } //shut down the executor service now executor.shutdown() } } 

실행기 서비스 종료

많은 개발자가 놓치는 중요하고 중요한 측면은 ExecutorService를 종료하는 것입니다. ExecutorService는 중요하며 추가 스레드 요소로 생성됩니다. 모든 비 데몬 스레드가 중지 된 경우에만 JVM이 중지된다는 점에 유의하십시오. 따라서 단순히 실행기 서비스를 종료하면 JVM이 중지되지 않습니다.

실행자 서비스에 스레드를 실행할 필요가 없음을 알리려면 서비스를 종료해야합니다.

종료를 호출하는 세 가지 방법이 있습니다.

  • 무효 종료 () – 이전에 제출 된 작업이 실행되지만 새 작업이 수락되지 않는 순서대로 종료를 시작합니다.
  • shutdownNow () 나열 – 현재 실행중인 모든 작업을 중지하고 보류중인 작업의 처리를 중지하며 실행 대기중인 작업 목록도 반환합니다.
  • 무효 awaitTermination () – 종료 요청 후 모든 작업이 실행을 완료하거나 시간 초과가 발생할 때까지 계속 차단됩니다. 현재 스레드가 중단 될 때도 차단됩니다. 모두 어떤 작업이 먼저 오는지에 따라 다릅니다.

이것으로 우리는 Java 기사의 Callable Interface의 끝까지 왔습니다. Java의 Future 및 Callable Interface에 대해 이해 하셨기를 바랍니다.

확인 전 세계에 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 작성했습니다. Edureka의 Java J2EE 및 SOA 교육 및 인증 과정은 Java 개발자가 되고자하는 학생과 전문가를 위해 설계되었습니다.

질문이 있으십니까? 이 'Java의 호출 가능한 인터페이스'블로그의 댓글 섹션에 언급 해 주시면 가능한 한 빨리 연락 드리겠습니다.