run () 방법에 매개 변수를 전달하는 방법

2627 단어
실현 방식은 주로 세 가지가 있다
1. 구조 함수 전참
2. 구성원 변수 전참
3. 리셋 함수 참조
 
문제: 처리 라인의 반환값을 어떻게 실현합니까?
1. 메인 스레드 대기법(장점: 실현하기가 간단하고 단점: 기다려야 할 변수가 많으면 코드가 매우 비대해진다. 게다가 시간을 정확하게 제어할 수 없다)
public class CycleWait implements Runnable{
    private String value;
    public void run() {
        try {
            Thread.currentThread().sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        value = "we have data now";
    }

    public static void main(String[] args) throws InterruptedException {
        CycleWait cw = new CycleWait();
        Thread t = new Thread(cw);
        t.start();
//        while (cw.value == null){
//            Thread.currentThread().sleep(100);
//        }
        t.join();
        System.out.println("value : " + cw.value);
    }
}

  
2. Thread 클래스의join()을 사용하여 현재 스레드를 막아서 하위 스레드가 처리되기를 기다립니다(단점: 정확도가 부족함)
 
3. Callable 인터페이스를 통해 구현: FutureTask Or 스레드 풀을 통해 획득
public class MyCallable implements Callable {
    @Override
    public String call() throws Exception{
        String value="test";
        System.out.println("Ready to work");
        Thread.currentThread().sleep(5000);
        System.out.println("task done");
        return  value;
    }
}

FutureTask 구현 방법
public class FutureTaskDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask task = new FutureTask(new MyCallable());
        new Thread(task).start();
        if(!task.isDone()){
            System.out.println("task has not finished, please wait!");
        }
        System.out.println("task return: " + task.get());
    }
}

스레드 풀 구현 방식
public class ThreadPoolDemo {
    public static void main(String[] args) {
        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
        Future future = newCachedThreadPool.submit(new MyCallable());
        if(!future.isDone()){
            System.out.println("task has not finished, please wait!");
        }
        try {
            System.out.println(future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } finally {
            newCachedThreadPool.shutdown();
        }
    }
}

  
 
전재 대상:https://www.cnblogs.com/vingLiu/p/10663385.html

좋은 웹페이지 즐겨찾기