代码详解の使用CountDownLatch解决面试问题:T1和T2线程执行计算,T3线程计算结果的统计

来源:互联网 发布:郝斌老师c语言笔记 编辑:程序博客网 时间:2024/04/30 09:36
package com.sdmjhca.springBootDemo.synchronizedtest;import java.util.concurrent.CountDownLatch;/** * 例子:T1T2线程执行计算,T3线程进行T1T2结果的统计 * 思路定义一个锁计数器2的线程并发类,T3通过await方法进行锁等待,T1执行完成后计数器-1T2完成后计数器-1 * 当计数器为0后,T3开始执行统计方法,得到最终计算结果 * @author JHMI on 2017/8/18. */public class SynchronizedMain {    private static CountDownLatch start = new CountDownLatch(1);    private static CountDownLatch end = new CountDownLatch(2);    private static int i = 1;    private static int j = 1;    public static void main(String args[]) throws InterruptedException {        Thread t1 = new Thread(new Runnable() {            @Override            public void run() {                try {                    start.await();                    System.out.println("T1开始执行");                    //SynchronizedTest.staticIn.method1();                    i++;                    //Thread.sleep(1000);                    end.countDown();                    System.out.println("T1计算结束");                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        });        Thread t2 = new Thread(new Runnable() {            @Override            public void run() {                try {                    start.await();                    System.out.println("T2开始执行");                   // SynchronizedTest.staticIn.method2();                    j++;                    //Thread.sleep(1000);                    end.countDown();                    System.out.println("T2执行结束");                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        });        Thread t3 = new Thread(new Runnable() {            @Override            public void run() {                try {                    start.await();                    System.out.println("T3开始执行,进入等待状态");                    end.await();                    System.out.println("获得锁 开始执行T3");                } catch (InterruptedException e) {                    e.printStackTrace();                }                //Thread.sleep(1000);                int c = i+j;                System.out.println("统计结果="+c);                System.out.println("T3执行结束");            }        });        t1.start();        t2.start();        t3.start();        start.countDown();       /* i = i+j;        System.out.println("i="+i);*/    }}
阅读全文
0 0
原创粉丝点击