1. 程式人生 > >java執行緒間的通訊方式

java執行緒間的通訊方式

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();
    }
}