处理实现线程获取值

方式一:主线程等待法

如果未获取到值,则主线程等待,一直到获取值为止。

    package mrzhangxd.xyz.thread;
    
    /**
     * CopyRight (C),2019
     *
     * @ClassName: ThreadWait
     * @Auther: zhangxiaodong3
     * @Created: 2019/12/2015:11
     * @Description: 处理实现线程获取值
     */
    
    /**
      * 如果未获取到值,则主线程等待,一直到获取值为止。
      */
    public class ThreadWait implements Runnable{
    
        private String value;
    
        public static void main(String[] args){
    
            ThreadWait tw = new ThreadWait();
            Thread t = new Thread(tw);
            t.start();
    
            //TODO:如果未获取到值,则主线程等待,一直获取到值为止
            while (tw.value == null){
    
                try {
                    //主线程等待法
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            System.out.println("Value:"+tw.value);
            //输出结果:Value:My name is MrZhangxd!!!
        }
        @Override
        public void run() {
    
    
            try {
    
                Thread.sleep(5000);
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            value = "My name is MrZhangxd!!!";
    
        }
    }

方式二:join()

使用 Thread 的 join() 阻塞当前线程以等待子线程处理完毕。

package mrzhangxd.xyz.thread;

/**
 * CopyRight (C),2019
 *
 * @ClassName: ThreadWaitJoin
 * @Auther: zhangxiaodong3
 * @Created: 2019/12/2015:26
 * @Description: 处理实现线程获取值
 */

//使用 Thread 的 join() 阻塞当前线程以等待子线程处理完毕。

public class ThreadWaitJoin implements Runnable {

    private  String value;

    public static void main(String[] args) throws InterruptedException {

        ThreadWaitJoin twj = new ThreadWaitJoin();
        Thread t = new Thread(twj);
        t.start();

        //TODO:使用 Thread 的 join 方法阻塞当前线程,等待子线程执行完毕
        t.join();//阻塞当前主线程,直到 t 线程执行完毕
        System.out.println("Value:" + twj.value);

        //输出结果:
        //Value:My name is MrZhangxd!!!
    }

    @Override
    public void run() {


        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        value = "My name is MrZhangxd!!!";

    }
}

方式三:Callable + FutureTask

实现 Callablee 接口,使用 FutureTask 接收 call() 方法返回的数据。

package mrzhangxd.xyz.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * CopyRight (C),2019
 *
 * @ClassName: ThreadWaitFutureTask
 * @Auther: zhangxiaodong3
 * @Created: 2019/12/2015:45
 * @Description: 处理实现线程获取值
 */

//实现 Callablee 接口,使用 FutureTask 接收 call() 方法返回的数据。
public class ThreadWaitFutureTask implements Callable<String> {

    private  String value;

    public static void main(String[] args)throws InterruptedException, ExecutionException{

        ThreadWaitFutureTask twft = new ThreadWaitFutureTask();

        FutureTask ft = new FutureTask(twft);

        Thread t = new Thread(ft);

        t.start();


        while (!ft.isDone()){
                // FutureTask 的 get() 方法会一直阻塞,一直会等待任务执行完毕,才返回。
                Thread.sleep(1000);

        }

            System.out.println("Vaule:"+ft.get());

        //输出结果:
        //Vaule:My  name is MrZhangxd!!!

    }
    @Override
    public String call() throws Exception {

        Thread.sleep(5000);
        value = "My  name is MrZhangxd!!!";
        return value;
    }

}

方式四:线程池 + Future

线程池执行任务,返回的结果使用 Future 接收。

package mrzhangxd.xyz.thread;

import java.util.concurrent.*;

/**
 * CopyRight (C),2019
 *
 * @ClassName: ThreadWaitFuture
 * @Auther: zhangxiaodong3
 * @Created: 2019/12/20 15:58
 * @Description: 处理实现线程获取值
 */

//线程池执行任务,返回的结果使用 Future 接收。

public class ThreadWaitFuture implements Callable<String> {

    private String vaule;

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        ExecutorService service = Executors.newCachedThreadPool();
        ThreadWaitFuture twf = new ThreadWaitFuture();
        //将任务提交给线程池处理
        Future<String>  future = service.submit(twf);

        while (!future.isDone()){

            Thread.sleep(1000);

        }

        System.out.println("Value:"+future.get());
        //关闭线程池
        service.shutdown();

        //运行结果:
        //Vaule:My name is MrZhangxd!!!

    }

    @Override
    public String call() throws Exception {

        Thread.sleep(5000);
        vaule = "My name is MrZhangxd!!!";
        return vaule;
    }
}
原文地址:https://www.cnblogs.com/MrZhangxd/p/12073917.html