호출 가능 및 미래를 사용한 병렬 프로그래밍
Java에서 병렬 프로그래밍을 수행하는 가장 일반적인 방법은 스레드 클래스를 상속하거나 실행 가능한 인터페이스를 구현하는 것입니다. 이 두 가지 방법의 단점은 작업이 완료된 후 직접 실행 결과를 얻을 수 없으며 공유 변수 또는 스레드 간을 통해 전달되어야한다는 것입니다.
Java 1.5에서 시작하여 호출 가능 및 향후 인터페이스가 제공됩니다. 그것들을 사용하면 작업이 실행 된 후에 실행 결과를 얻을 수 있습니다.
Callable, Future 및 Futuretask를 사용하는 방법을 배우겠습니다.
호출 가능한 인터페이스
호출 가능한 인터페이스는 java.util.concurrent 패키지에 있습니다. 이것은 콜 () 메소드 만 선언하는 일반적인 인터페이스입니다.
public interface callable <t> {t call ()은 예외를 던집니다;}일반적으로 ExecutorService 인터페이스와 함께 사용됩니다. ExecutorService 인터페이스에서 몇 가지 과부하 된 제출 방법이 선언됩니다.
<T> Future <T> 제출 (Callable <T> 작업); <T> Future <T> 제출 (Runnable Task, T result); Future <?> 제출 (Runnable Task);
첫 번째 제출 방법의 매개 변수 유형은 호출 가능하며 다른 두 가지는 당시이 기사에서 다루지 않습니다.
미래와 FutureTask
향후 인터페이스의 구현 클래스는 런 가능 또는 호출 가능한 작업에 대한 취소, 쿼리 및 결과를 얻는 것과 같은 작업을 수행 할 수 있습니다.
향후 인터페이스는 java.util.concurrent 패키지 아래에 있습니다.
공개 인터페이스 미래 <t> { /***취소 작업*@param mayinterruptifrunning*실행 중이지만 완료되지 않은 작업을 취소 할 수 있습니까? true가 설정되면 프로세스의 작업이 취소 될 수 있음을 의미합니다. /***작업이 성공적으로 취소됩니까? 작업이 정상적으로 완료되기 전에 성공적으로 취소되면 true */ boolean iscancelled ()를 반환합니다. / ***작업이 완료됩니까*/ boolean isdone (); / ***차단을 통해 실행 결과를 가져옵니다*/ t get () throws InterruptedException, executionException; /***차단을 통해 실행 결과를 얻습니다. 지정된 시간 내에 반환이 반환되지 않으면 return null */ t get (Long Timeout, TimeUnit Unit)는 InterruptedException, executionException, timeoutException;} 던지기요약하면, Future는 세 가지 기능을 제공합니다.
작업이 완료되었는지 여부를 결정하고 작업을 방해하고 작업 실행 결과를 얻을 수 있습니다.
JDK는 우리에게 향후 두 개의 생성자가있는 향후 인터페이스 구현 클래스 FutureTask를 제공합니다.
Public FutureTask (Callable <T> Callable) {} Public FutureTask (Runnable Runnable, T result) {} 샘플 코드
Callable, Future를 사용합니다
import java.util.concurrent.*; public class test {public static void main (string [] args) {executorService executorService = executors.newCachedThreadPool (); 작업 작업 = 새로운 작업 (); 미래의 <integer> 미래 = executorService.submit (작업); ExecutorService.shutdown (); System.out.println ( "기본 스레드가 작업을 실행 중입니다 ..."); try {thread.sleep (2000); } catch (InterruptedException ex) {ex.printstacktrace (); } try {system.out.println ( "작업 실행 결과 :"+future.get ()); } catch (InterruptedException ex) {ex.printstacktrace (); } catch (executionException ex) {ex.printstacktrace (); } system.out.println ( "모든 작업이 실행되었습니다"); }} 클래스 작업 구현 호출 가능 <integer> {@override public integer call ()는 예외 {system.out.println ( "자식 스레드가 실행 중입니다 ..."); // 시뮬레이션 작업 시간이 걸립니다. Sleep (5000); 반환 1000; }}실행 결과 :
자식 스레드가 작업을 실행 중입니다 ... 기본 스레드가 작업을 실행 중입니다 ... 작업 작동 결과 : 1000 모든 작업이 실행되었습니다.
호출 가능한 FutureTask를 사용하십시오
import java.util.concurrent.*; public class test {public static void main (string [] args) {executorService executorService = executors.newCachedThreadPool (); 작업 작업 = 새로운 작업 (); FutureTask <integer> futuretask = 새로운 FutureTask <integer> (작업); ExecutorService.Submit (FutureTask); ExecutorService.shutdown (); System.out.println ( "기본 스레드가 작업을 실행 중입니다 ..."); try {thread.sleep (2000); } catch (InterruptedException ex) {ex.printstacktrace (); } try {system.out.println ( "작업 실행 결과 :"+futureetask.get ()); } catch (InterruptedException ex) {ex.printstacktrace (); } catch (executionException ex) {ex.printstacktrace (); } system.out.println ( "모든 작업이 실행됩니다"); }} 클래스 작업 구현 호출 가능 <integer> {@override public integer call ()는 예외 {system.out.println ( "자식 스레드가 작업을 실행 중입니다 ..."); // 작업을 시뮬레이션하면 thread.sleep (5000)가 사용됩니다. 반환 1000; }}실행 결과 :
자식 스레드가 작업을 실행 중입니다 ... 기본 스레드가 작업을 실행 중입니다 ... 작업 작동 결과 : 1000 모든 작업이 실행되었습니다.
요약
위의 것은 Java의 병렬 프로그래밍에 Callable 및 Future를 사용하는 것에 대한이 기사의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!