多线程计数器之CountDownLatch和join

原创 2016年08月31日 16:34:25
       多线程访问全局变量,对同一全局变量的修改会影响其他线程变量的值。

       多线程访问局部变量,对变量的修改不会影响其他线程中该变量的值。


/**
 * 这个是实现计数器操作,主线程等待子线程全部完成
 * 模拟场景:10个人赛跑,当所有的人到达终点后,比赛结束
 * @author zhangm
 *
 */
public class TestCountDownLatch  {

	 //计数器,从2开始计数
	 private final static CountDownLatch mCountDownLatch = new CountDownLatch(3);
	 
	 /**
	     * 示例工作线程类
	     */
	    private static class WorkingThread extends Thread {
	        private final String mThreadName;
	        private final int mSleepTime;
	        public WorkingThread(String name, int sleepTime) {
	            mThreadName = name;
	            mSleepTime = sleepTime;
	        }
	        
	        @Override
	        public void run() {
	            System.out.println("[" + mThreadName + "] started!");
	            try {  
	                    Thread.sleep(mSleepTime);  
	            } catch (InterruptedException e) {  
	                    e.printStackTrace();  
	            }
	            mCountDownLatch.countDown();
	            System.out.println("[" + mThreadName + "] end!"); 
	        }
	    }
	    
	    /**
	     * 示例线程类
	     */
	    private static class SampleThread extends Thread {
	        
	        @Override
	        public void run() {
	            System.out.println("[SampleThread] started!");
	            try {
	                // 会阻塞在这里等待 mCountDownLatch 里的count变为0;
	                // 也就是等待另外的WorkingThread调用countDown()
	                mCountDownLatch.await();
	            } catch (InterruptedException e) {
	                
	            }
	            System.out.println("[SampleThread] end!");
	        }
	    }
	    
	    public static void main(String[] args) throws Exception {
	        // 最先run SampleThread
	        new SampleThread().start();
	        // 运行工作线程
	        new WorkingThread("WorkingThread1", 1000).start();
	        new WorkingThread("WorkingThread2", 2000).start();
	        new WorkingThread("WorkingThread3", 1000).start();
	    }
	
} 

执行结果如下:

[SampleThread] started!
[WorkingThread1] started!
[WorkingThread2] started!
[WorkingThread3] started!
[WorkingThread1] end!
[WorkingThread2] end!
[WorkingThread3] end!
[SampleThread] end!


另外还可以使用join使得主线程等待子线程完成。

public class TestJoin extends Thread{

	private  String name;
	private  int  time;
	
	public TestJoin(String name,int time)
    {
        this.name=name;
        this.time=time;
    }

	//子线程执行部分
    @Override
    public void run()
    {
        System.out.println(this.getName() + " staring...");
        try {  
            Thread.sleep(time);  
	    } catch (InterruptedException e) {  
	            e.printStackTrace();  
	    }
        System.out.println(this.getName() + " end...");
    }

    
    public static void main(String[] args)
    {
        System.out.println("main thread starting...");

        List<TestJoin> list = new ArrayList<TestJoin>();

        int time;
        for (int i = 1; i <= 5; i++)
        {
        	time=(int) (Math.random()*3+1);
        	TestJoin my = new TestJoin("Thrad " + i,1000*time);
            my.start();
            list.add(my);
        }

        try
        {
            for (TestJoin my : list)
            {
                my.join();
            }
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }

        System.out.println("main thread end...");

    }

}




版权声明:本文为博主原创文章,未经博主允许不得转载。

CountDownLatch理解一:与join的区别

首先,我们来看一个应用场景1: 假设一条流水线上有三个工作者:worker0,worker1,worker2。有一个任务的完成需要他们三者协作完成,worker2可以开始这个任务的前提是worker0...
  • zhutulang
  • zhutulang
  • 2015年09月17日 00:21
  • 6552

多线程CountDownLatch和Join

多线程CountDownLatch和Join
  • a1181191837
  • a1181191837
  • 2017年03月04日 16:21
  • 454

CountDownLatch的使用(倒计时计数器)

countDown()将计数器减一await()等待计数器值为0,当到达0时所有等待者开始执行import java.util.concurrent.CountDownLatch; import ja...
  • jethai
  • jethai
  • 2016年08月28日 14:06
  • 220

多线程计数器之CountDownLatch和join

多线程访问全局变量,对同一全局变量的修改会影响其他线程变量的值。        多线程访问局部变量,对变量的修改不会影响其他线程中该变量的值。 /** * 这个是实现计数器操作,主线程等...
  • zhangxiaomin1992
  • zhangxiaomin1992
  • 2016年08月31日 16:34
  • 255

CountDownLatch和join两种方式实现多线程并行处理

上一篇博客主要介绍了如何使用Semaphore串行打印ABC,这一篇将介绍如何并行打印ABC,功能如下: 有三个线程,线程1打印A,线程2打印B,线程3打印C,这里假设是必须做完A、B、C,才能根据...
  • buptwds
  • buptwds
  • 2016年07月19日 14:59
  • 399

测试CountDownLatch和任务数量相同的线程并行

public class TestCountDownLatch { public static void main(String[] args) throws InterruptedExcepti...
  • huihui870311
  • huihui870311
  • 2017年06月01日 17:51
  • 149

使用线程池与CountDownLatch多线程提升系统性能

下面这个业务场景,大家可能都会遇到,在遍历一个list的时候,需要对list中的每个对象,做一些复杂又耗时的操作,比如取出对象的uid,远程调用一次userservice的getUserByUid方法...
  • Derek_BMW
  • Derek_BMW
  • 2016年08月17日 21:03
  • 1333

CountDownLatch理解一:与join的区别 Done

http://blog.csdn.net/zhutulang/article/details/48504487 首先,我们来看一个应用场景1: 假设一条流水线上有三个工作者...
  • liangxw1
  • liangxw1
  • 2016年04月25日 16:58
  • 327

Java之CountDownLatch使用

CountDownLatch 1、类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于...
  • shihuacai
  • shihuacai
  • 2013年04月26日 20:55
  • 43093

并发工具类:等待多线程完成的CountDownLatch,和join的区别

CountDownLatch CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。  CountDownLatch用给定的计数初始化 C...
  • kusedexingfu
  • kusedexingfu
  • 2017年05月24日 22:00
  • 2564
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程计数器之CountDownLatch和join
举报原因:
原因补充:

(最多只允许输入30个字)