美文网首页
Java 线程 - CountDownLatch / Cycli

Java 线程 - CountDownLatch / Cycli

作者: 一颗北上广的心 | 来源:发表于2017-11-08 16:00 被阅读0次
  • CountDownLatch 一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行
package practice;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;

public class CountDonwLatchTest {

    static CountDownLatch countDownLatch = new CountDownLatch(3);
    static int[][] panel = new int[3][10];

    public static void main(String[] args) {
        Thread thread0 = new Thread(new CountDonwLatchTest.DrawLine(0));
        Thread thread1 = new Thread(new CountDonwLatchTest.DrawLine(1));
        Thread thread2 = new Thread(new CountDonwLatchTest.DrawLine(2));
        Thread showThread = new Thread(new CountDonwLatchTest.ShowPanel());

        showThread.start();
        thread0.start();
        thread1.start();
        thread2.start();
    }

    static class DrawLine implements Runnable {

        int index;

        public DrawLine(int index) {
            this.index = index;
        }

        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                panel[index][i] = index * 10 + i;
                try {
                    Thread.sleep(20);
                    System.out.println(index + "," + i + " done");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            countDownLatch.countDown();// 将count值减1
        }

    }

    static class ShowPanel implements Runnable {

        @Override
        public void run() {
            try {
                countDownLatch.await(); // 调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            for (int i = 0; i < panel.length; i++) {
                for (int j = 0; j < panel[i].length; j++) {
                    System.out.print(panel[i][j] + "\t,");
                }
                System.out.println();
            }

        }

    }
}

  • CyclicBarrier 它可以实现让一组线程等待至某个状态之后再全部同时执行
package practice;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {

    static CyclicBarrier barrier = new CyclicBarrier(3,new Mom()); 
    
    public static void main(String[] args) {
        Thread c1 = new Thread(new Guy("Tom"));
        Thread c2 = new Thread(new Guy("Lily"));
        Thread c3 = new Thread(new Guy("Jerry"));
        
        c1.start();
        c2.start();
        c3.start();
    }
    

    static class Guy implements Runnable{

        private String name;
        
        public Guy(String name) {
            this.name = name;
        }
        
        @Override
        public void run() {
            System.out.println(name +" is eating ...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name +" has done. I'm waiting to play.");
            try {
                barrier.await();
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println(name +" joined.");
        }
        
    }

    static class Mom implements Runnable{

        @Override
        public void run() {
            System.out.println("Mom clean the table.");
        }
        
    }
}

相关文章

网友评论

      本文标题:Java 线程 - CountDownLatch / Cycli

      本文链接:https://www.haomeiwen.com/subject/vflymxtx.html