Callable 인터페이스 - 반환 값이 있는 스레드
Callable
자바5는 이전에 되돌아오는 값이 없었습니다. 자바5는Callable 인터페이스를 추가하여 라인의 되돌아오는 값을 얻었습니다. 되돌아갈 수 있는 작업은 Callable 인터페이스를 실현해야 합니다. 이와 유사하고 되돌아오지 않는 작업은 Runnable 인터페이스를 사용해야 합니다.Callable의call 방법은 당신이 전송한 일반 파라미터에 따라 대응하는 형식의 데이터를 되돌려줍니다.Callable 작업을 수행하면 Future 대상을 얻을 수 있습니다. 이 대상에서 get을 호출하면 Callable 작업이 되돌아오는 Object를 얻을 수 있습니다.
예:package thread_Callable;
import java.util.concurrent.*;
public class Callable_Thread {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//
ExecutorService pool = Executors.newFixedThreadPool(2);
//
Callable c1 = new MyCallable("A");
Callable c2 = new MyCallable("B");
// Future
Future f1 = pool.submit(c1);
Future f2 = pool.submit(c2);
// Future ,
System.out.println(">>>"+f1.get().toString());
System.out.println(">>>"+f2.get().toString());
//
pool.shutdown();
}
}
class MyCallable implements Callable {
private String oid;
MyCallable(String oid) {
this.oid = oid;
}
@Override
public Object call() throws Exception {
return oid+" ";
}
}
:
>>>A
>>>B
Future 인터페이스에서 설명하는 5가지 방법은 다음과 같습니다.
cancel 방법은 작업을 취소하는 데 사용되며, 작업을 취소하는 데 성공하면true로 돌아가고, 작업을 취소하는 데 실패하면false로 돌아갑니다.매개 변수mayInterruptIfRunning은 실행 중이지만 완료되지 않은 작업을 취소할 수 있는지 여부를 나타내고true를 설정하면 실행 중인 작업을 취소할 수 있음을 나타냅니다.만약 작업이 이미 완성되었다면mayInterruptIfRunning이true든false든지 간에 이 방법은false로 되돌아갈 것이다. 즉, 이미 완성된 작업을 취소하면false로 되돌아갈 것이다.작업이 실행 중이면 mayInterruptIfRunning이true로 설정되면true로 돌아가고 mayInterruptIfRunning이false로 설정되면false로 돌아갑니다.작업이 실행되지 않은 경우 mayInterruptIfRunning이true이든false이든true로 돌아갑니다.
isCancelled 메서드는 작업이 취소되었는지 여부를 나타냅니다. 작업이 정상적으로 완료되기 전에 취소되었으면 true로 돌아갑니다.
isDone 메서드는 작업이 완료되었는지 여부를 나타내며 작업이 완료되면 true로 돌아갑니다.
get () 방법은 실행 결과를 가져오는 데 사용됩니다. 이 방법은 막혀서 작업이 끝날 때까지 기다립니다.
get (long timeout, Time Unit unit) 은 실행 결과를 가져오는 데 사용되며, 지정한 시간 안에 결과를 얻지 못하면,null로 돌아갑니다.
즉, Future는 세 가지 기능을 제공합니다.
1) 임무 수행 여부를 판단한다.
2) 작업을 중단할 수 있다.
3) 작업 수행 결과를 얻을 수 있습니다.
FutureTask
먼저 FutureTask의 구현을 살펴보겠습니다.
public class FutureTask implements RunnableFuture
FutureTask 클래스는 RunnableFuture 인터페이스를 구현했습니다. RunnableFuture 인터페이스의 구현을 살펴보겠습니다.
public interface RunnableFuture extends Runnable, Future
Runnable Future는 Runnable 인터페이스와 Future 인터페이스를 계승했고 Future Task는 Runnable Future 인터페이스를 실현했다.그래서 이것은 Runnable로 실행될 수도 있고,Future로써Callable의 반환 값을 얻을 수도 있다.
FutureTask는
public FutureTask(Callable callable) {
}
public FutureTask(Runnable runnable, V result) {
}
사실 FutureTask는 Future 인터페이스의 유일한 실현 클래스이다.package thread_Callable;
import java.util.concurrent.*;
/**
* User:
* Date: 18:39 2017/8/14
* Email: [email protected]
*/
public class Callable_FutureTask {
public static void main(String[] args) {
//
ExecutorService executor = Executors.newCachedThreadPool();
MyCallable2 task = new MyCallable2();
FutureTask futureTask = new FutureTask(task);
executor.submit(futureTask);
executor.shutdown();
// , , ExecutorService, Thread
/*Task task = new Task();
FutureTask futureTask = new FutureTask(task);
Thread thread = new Thread(futureTask);
thread.start(); */
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(" ");
try {
System.out.println("task "+futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(" ");
}
}
class MyCallable2 implements Callable {
@Override
public Integer call() throws Exception {
System.out.println(" ");
Thread.sleep(3000);
int sum = 0;
for(int i=0;i<100;i++)
sum += i;
return sum;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
package thread_Callable;
import java.util.concurrent.*;
public class Callable_Thread {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//
ExecutorService pool = Executors.newFixedThreadPool(2);
//
Callable c1 = new MyCallable("A");
Callable c2 = new MyCallable("B");
// Future
Future f1 = pool.submit(c1);
Future f2 = pool.submit(c2);
// Future ,
System.out.println(">>>"+f1.get().toString());
System.out.println(">>>"+f2.get().toString());
//
pool.shutdown();
}
}
class MyCallable implements Callable {
private String oid;
MyCallable(String oid) {
this.oid = oid;
}
@Override
public Object call() throws Exception {
return oid+" ";
}
}
:
>>>A
>>>B
먼저 FutureTask의 구현을 살펴보겠습니다.
public class FutureTask implements RunnableFuture
FutureTask 클래스는 RunnableFuture 인터페이스를 구현했습니다. RunnableFuture 인터페이스의 구현을 살펴보겠습니다.
public interface RunnableFuture extends Runnable, Future
Runnable Future는 Runnable 인터페이스와 Future 인터페이스를 계승했고 Future Task는 Runnable Future 인터페이스를 실현했다.그래서 이것은 Runnable로 실행될 수도 있고,Future로써Callable의 반환 값을 얻을 수도 있다.
FutureTask는
public FutureTask(Callable callable) {
}
public FutureTask(Runnable runnable, V result) {
}
사실 FutureTask는 Future 인터페이스의 유일한 실현 클래스이다.
package thread_Callable;
import java.util.concurrent.*;
/**
* User:
* Date: 18:39 2017/8/14
* Email: [email protected]
*/
public class Callable_FutureTask {
public static void main(String[] args) {
//
ExecutorService executor = Executors.newCachedThreadPool();
MyCallable2 task = new MyCallable2();
FutureTask futureTask = new FutureTask(task);
executor.submit(futureTask);
executor.shutdown();
// , , ExecutorService, Thread
/*Task task = new Task();
FutureTask futureTask = new FutureTask(task);
Thread thread = new Thread(futureTask);
thread.start(); */
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(" ");
try {
System.out.println("task "+futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(" ");
}
}
class MyCallable2 implements Callable {
@Override
public Integer call() throws Exception {
System.out.println(" ");
Thread.sleep(3000);
int sum = 0;
for(int i=0;i<100;i++)
sum += i;
return sum;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.