또한 스레드와의 Runnable은 또한 방법의 세 번째 호출 가능이 스레드를 만들 것을 알고

내가 하나가 Thread 클래스를 상속하는 세 가지 방법이 있습니다, 대부분의 학생들은 스레드 일반적인를 만드는 너무 많은 스레드를 알고 믿고, 하나의 Runnable 인터페이스를 달성하는 것입니다, 마지막 하나는 호출 가능하다, 오늘 소개 호출 가능의 마지막 특이한 방법입니다 .

첫째, 왜이 호출 인터페이스는해야

이 인터페이스의 앞에, 왜 우리는 그것의 세 번째가 필요 않기 때문에? 그런데 처음 두에 결함이 있기 때문에, 우리가 달성하고 계시 돌아올 앞의 두 가지 방법을 살펴입니다 :

class MyThread extends Thread{
	@Override
	public void run() {
		System.out.println("继承Thread");
	}
}
class MyRunnable implements Runnable{
	@Override
	public void run() {
		System.out.println("实现了Runnable");
	}
}

이제 우리는 이러한 두 가지 방법은 처리 후 구조체를 반환 할 수없는 말을하는 것입니다 반환 무효 것을 실행 방법, 내부 관찰합니다. 그러나 호출 인터페이스의 출현 효과적으로이 문제를 해결할 수 있습니다. 대답은 간단하다. 이제 방법을 볼 수 있습니다.

둘째, 사용 호출 인터페이스

1 스레드를 만들고

의 스레드 구현을 호출 인터페이스를 만들 수 있습니다.

class MyCallable implements Callable<Integer>{
	@Override
	public Integer call() throws Exception {
		int retValue = 10;
		return retValue;
	}
}

어떻게 사용 하는가? 앞의 두 동일처럼? 이 우리가 다음 단계는 사용하는 것입니다, 내장 문제의 약간 수 있지만 이번에는 우리가 와서 안티 그래서 우리는, 아니 너무 쉽게 이해하는 단어의 직접 사용을 소개합니다.

2 개 스레드

스레드의 생성자에서 살펴 보자 :

public Thread() {}
public Thread(Runnable target) {}
Thread(Runnable target, AccessControlContext acc) {}
public Thread(ThreadGroup group, Runnable target) {}
public Thread(String name) {}
public Thread(ThreadGroup group, String name) {}
public Thread(Runnable target, String name) {}
public Thread(ThreadGroup group, Runnable target, String name) {}
public Thread(ThreadGroup group, Runnable target, String name,
     long stackSize) {}

나는이 소스 jdk1.8에서 촬영 한 목록 아홉 생성자의 총,하지만 조심 관찰 찾을 수없는 생성자 전에 간단한 방법의 종류에 따라 스레드를 만들 수 없습니다 의미 호출 인터페이스를 통과 할 수있다. 이번에는 그것을 어떻게 할까? 그들은 사고 방식을 변경해야합니다.

스레드가 반환 값을 가질 수 있기 때문에 당신이 함수 인터페이스의 미래를 생각할 수 있다면, 나는 우리 고정 된 쿼리를 모르는 :

//1、FutureTask实现了RunnableFuture
public class FutureTask<V> implements RunnableFuture<V>
//2、RunnableFuture又是继承了Runnable和Future
public interface RunnableFuture<V> extends Runnable, Future<V>
//3、Future接口的常用方法
public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

위의 코드에서, 우리는 FutureTask에게 구현 클래스를 볼 수 있습니다, 모두 실행 가능한 스레드의 특성도 기능을 반환 할 수 있습니다 특징 미래가 있습니다. 그래서 우리는 호출 가능의 FutureTask 사용을 구현하는이 클래스를 사용할 수 있습니다.

class MyCallable implements Callable<Integer>{
	@Override
	public Integer call() throws Exception {
		System.out.println(Thread.currentThread().getName()+"进入callable");
		int retValue = 10;
		return retValue;
	}
}
public class Test3 {
	public static void main(String[] args) throws Exception{
		FutureTask<Integer> task = new FutureTask<>(new MyCallable());
		Thread thread = new Thread(task,"线程A");
		thread.start();
		//线程运行结束,说明Callable接口的方法已经完成,此时我们就可以获取返回值
		System.out.println("Callable返回的结果是:"+task.get());
	}
}

이 사용하는 기본 방법입니다. 미래 코스는 또한 많은 다른 방법을 제공합니다 :

(1)이 임무가 실패 취소 false를 반환하는 경우 작업이 성공적으로 진정한 수익을 취소 할 경우, 작업을 취소하는 방법을 취소 할 수 있습니다.

매개 변수를 MayInterruptIfRunning하는 작업이 수행되고 있지만, true로 설정하면, 작업이 실행되는 과정에서 취소 할 수 있습니다 완료되지 않은 취소 할 수 있는지 여부를 나타냅니다. 작업이 완료 된 경우에 관계없이 mayInterruptIfRunning,이 방법은 확실히, false를 돌려 참 또는 거짓입니다, 작업이 false를 돌려줍니다 취소 된 경우;

작업이 수행되는 경우 mayInterruptIfRunning true로 설정하면, 그것은, true를 돌려줍니다

false로 설정하면 거짓이 반환됩니다 MayInterruptIfRunning;

작업이 실행되지 않은 경우에 관계없이 mayInterruptIfRunning은 참 또는 거짓이다, 확실히 true를 돌려줍니다.

(2)의 isCancelled 방법은 성공이 작업이 정상적으로 완료되기 전에, 그것이 사실 반환 취소되는 경우 작업이 성공적으로 취소되었는지 여부를 나타냅니다.

(3)의 isDone 방법은 작업이 작업이 완료되면, 완성 true를 반환되었는지의 여부를 나타낸다

작업이 반환하기 전에 완료 될 때까지 (4) GET () 결과를 얻기 위해 사용 방법,이 방법은 장애물을 생성 할 것이다, 그것은 기다릴 것이다;

(5) GET (긴 시간 초과 예외 : InterruptedException 장치) 지정된 시간이 결과 획득하지 않은 경우 결과를 얻기 위해 사용 직접 돌려줍니다.

기본적으로 그게 다입니다. 사실, 자주 사용 ExecutorService를 결합, 우리는 예를 살펴 지금 :

public class Test3 {
	public static void main(String[] args) throws Exception{
        ExecutorService executor = Executors.newCachedThreadPool();
        FutureTask<Integer> futureTask = new FutureTask<Integer>
        								(new MyCallable());
        executor.submit(futureTask);
        executor.shutdown();
		//线程运行结束,说明Callable接口的方法已经完成,此时我们就可以获取返回值
		System.out.println("Callable返回的结果是:"+futureTask.get());
	}
}

사용법은이 너무 일반적이다. 호출 가능 인터페이스이기 때문에, 소스 코드 분석은 이해가되지 않도록. 확인이 도입 호출 가능 인터페이스, 먼저 여기.

당신은 질문이있는 경우도 비판을 초대했다.

게시 된 256 개 원래 기사 · 원 찬양 75 · 전망 (130) 000 +

추천

출처blog.csdn.net/SDDDLLL/article/details/104594666