java线程间的通信方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27603235/article/details/78203796

1.三个运动员各自准备,等到三个人都准备好后,再一起跑
如何能够让每个线程都准备好执行,然后一起执行任务?
1.先创建一个公共 CyclicBarrier 对象,设置 同时等待 的线程数,CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
2.这些线程同时开始自己做准备,自身准备完毕后,需要等待别人准备完毕,这时调用 cyclicBarrier.await(); 即可开始等待别人;
3.当指定的 同时等待 的线程数都调用了 cyclicBarrier.await();时,意味着这些线程都准备完毕好,然后这些线程才 同时继续执行。

package Test;/**
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @author Administrator wangtao
 * @createdate 2017-10-10
 */
public class demo5 {
    public static  void main(String[] args ){
        int runner =3;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(runner);
        final Random random = new Random();
        for(char runnerName='A';runnerName<='C';runnerName++){
            final String rN = String.valueOf(runnerName);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    long preparetime = random.nextInt(10000) +100;
                    System.out.println(rN +"is preparing for time:"+preparetime);
                    try {
                        Thread.sleep(preparetime);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    try {
                        System.out.println(rN + "is prepared, waiting for others");
                        cyclicBarrier.await();// 当前运动员准备完毕,等待别人准备好
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                    System.out.println(rN + "starts running");// 所有运动员都准备好了,一起开始跑
                }
            }).start();
        }
    }
}

2.子线程完成某件任务后,把得到的结果回传给主线程
在实际的开发过程中,子线程往往用来处理比较耗时的工作,那么要怎么把子线程的处理结果返回给主线程呢。在这里可以利用Callable这个类,配合futureTask类,来将子线程的处理结果返回给主线程。

private static void doTaskWithResultInWorker() {
    Callable<Integer> callable = new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {
            System.out.println("Task starts");
            Thread.sleep(1000);
            int result = 0;
            for (int i=0; i<=100; i++) {
                result += i;
            }
            System.out.println("Task finished and return result");
            return result;
        }
    };
    FutureTask<Integer> futureTask = new FutureTask<>(callable);
    new Thread(futureTask).start();
    try {
        System.out.println("Before futureTask.get()");
        System.out.println("Result:" + futureTask.get());
        System.out.println("After futureTask.get()");
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_27603235/article/details/78203796