다섯, 사용의 호출 멀티 스레드 자바 예

I. 배경

시간 위의 사업뿐만 아니라, 프로그램, 멀티 스레딩의 최종 사용의 효율성을 개선하기 위해 1. 나는 다중 스레드 달성하기 위해 호출을 사용합니다. 저는 여기에 간단한 작은 밤나무가 줄 아래 사용합니다.

두, 호출 프로필

1. 자바는 두 가지 방법이 있습니다 스레드를 생성, 하나는 하나의 Runnable 인터페이스를 달성하는 것입니다, Thread 클래스 상속입니다. 그러나, 이들 두 가지 방법의 단점은 실행 태스크의 실의 끝에, 결과가 얻어 질 수 없다는 것이다. 우리는 일반적으로 단지 작업의 결과를 얻기의 목적을 달성하기 위해 공유 변수 또는 공유 메모리 및 스레드 통신 수단을 사용합니다.

2.Java에서, 또한 작업의 결과에 대한 액세스를 달성하기 위해 운영 사용 호출 가능하고 미래를 제공합니다. 호출 작업은 생산 결과를 수행하고, 미래 결과를 얻을 수 있습니다.

여부 3.Callable 인터페이스가보기 소스 코드의 Runnable 인터페이스와 유사합니다, 당신은 다음과 같이 정의 호출 인터페이스를 볼 수 있습니다

@FunctionalInterface
public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

그것은 일반적인 메서드 호출 반환 값 V.와, 그에서의 Runnable 인터페이스 다릅니다 볼 수 있습니다

셋째, 작은 밤

1. 코드

public class Test0002 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future<String> submit = executorService.submit(new TaskCallable());
        System.out.println("执行任务开始(主线程)。。。");
        String result = submit.get();
        System.out.println(result);
        System.out.println("执行任务结束(主线程)。。。");
    }

    static class TaskCallable implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("执行任务开始(子线程)。。。");
            Thread.sleep(5000);
            System.out.println("执行任务结束(子线程)。。。");
            return "chenmingxu";
        }
    }
}

2. 결과

执行任务开始(主线程)。。。
执行任务开始(子线程)。。。
执行任务结束(子线程)。。。
chenmingxu
执行任务结束(主线程)。。。

분석 (3)

프로그램이 차단되지 않습니다,하지만 이후에만 모든 결과는, 메인 프로그램이 시작됩니다 얻을 차단 후 프로그램이 발생하기 전에 3.1.submit.get ()는 메인 프로그램입니다.

3.2. 우리가 추출 별도의 코드의 결과를 얻을 수있는 별도의 스레드를 열 수 있습니다 그래서, 당신은 메인 쓰레드와 서로 독립적으로 프로그램의 성능을 개선 할 수 있도록있다.

일반적인 방법 4.future

V의 리스팅 () : 검색 결과가 없을 경우 비동기 연산이 완료 될 때까지이 방법을 차단 비동기 실행 결과를 취득.

GET에 V (긴 시간 초과 TimeUnit와 단위) : 검색 결과가 없을 경우,이 방법은 차단 비동기 실행 결과를 취득하지만, 차단 시간이 설정된 제한 시간을 초과하면 시간 제한에있어서, 예외를 발생,있다.

부울의 isDone () : 작업 실행 종료, 정상 또는 비정상 동안 양쪽 끝 또는 취소 된 경우, true를 돌려줍니다.

부울 isCanceller는 () : 작업이 완료되면 전자는 true를 반환, 취소됩니다.

부울 취소 (부울 mayInterruptRunning) : 작업이 시작되지 않은 경우, (...) 거짓 메서드가 반환 취소 실행, 작업이 이미 시작된 경우, 실행이 작업을 중지하려고 스레드를 중단합니다이 작업을 수행하기 위해 (사실) 메소드를 취소, 당신이 성공적으로 중지하면 TRUE를 반환; 작업이 완료되면, 실행 취소, 작업이 시작되었을 때, 실행 취소 (false)를 방법은 작업 실행 스레드 (완료 정상적인 실행에 스레드), 다음 false를 반환에 영향을주지 않습니다 (...) 메소드는 false를 반환합니다. 매개 변수를 mayInterruptRunning하면 실행 스레드를 중단 여부를 나타냅니다.

(1) 작업 완료 (3)을 수행할지 여부를 결정하기 위해 작업 실행 (2) 중단 할 수 작업의 실행 결과의 전체 양을 가져옵니다 : 우리는 또한 분석의 방법은 실제로 미래는 세 가지 기능을 제공함으로써 것을 알고있다.

넷째, 예

1. 코드

public class Test0002 {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future<String> submit = executorService.submit(new TaskCallable());
        System.out.println("执行任务开始(主线程)。。。");
        new Thread(new Runnable() {
            @Override
            public void run() {
                String result = null;
                try {
                    result = submit.get();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println(result);
            }
        }).start();
        System.out.println("执行任务结束(主线程)。。。");
        executorService.shutdown();
    }
    static class TaskCallable implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("执行任务开始(子线程)。。。");
            String name = "chenmingxu";
            System.out.println("执行任务结束(子线程)。。。");
            return testDemo(name);
        }
        private String testDemo(String name) throws InterruptedException {
            Thread.sleep(5000);
            return name;
        }
    }
}

2. 결과

执行任务开始(主线程)。。。
执行任务开始(子线程)。。。
执行任务结束(子线程)。。。
执行任务结束(主线程)。。。
chenmingxu

분석 (3)

3.1. 우리는 서로 영향을받지 않습니다 위의 결과뿐만 아니라, 우리의 주요 스레드와 자식 스레드 실행에서 볼 수 있습니다.

다섯째, 말

1.Always는 믿음을 유지!

게시 된 122 개 원래 기사 · 원 찬양 64 ·은 50000 +를 볼

추천

출처blog.csdn.net/chenmingxu438521/article/details/103784042