多线程计数器之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...");

    }

}




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

相关文章推荐

Java多线程与并发库高级应用之倒计时计数器CountDownLatch

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- CountDownLatch...

java多线程Thread join与CountDownLatch源码分析

本文从源码的角度分析Thread.join、CountDownLatch闭锁的实现语义与实现原理,并举例说明join方法,闭锁的使用场景。...

多线程CountDownLatch和Join

多线程CountDownLatch和Join

java CountDownLatch 多线程文件搜索

基于多线程搜索文件,并且将最终的结果进行打印。这里使用了CountDownLatch线程协作机制,主线程等待多个搜索线程完成,并对最终结果进行打印。具体例子如下:...

关于java多线程浅析七:CountDownLatch的原理分析和使用

什么是CountDownLatchCountDownLatch与CyclicBarrier一样,也是一个用与同步的辅助类,它的使用场景是:在一个或者一组其他线程没有执行完毕之前,使当前线程进行等待,只...

令仔学多线程系列(一)----同步工具类CountDownLatch

简单介绍          简单的介绍下CountDownLatch,是在jdk1.5被引入的,是在java.util.concurrent包下,它允许一个或者多个线程一直等待,直到其他线...

并发控制(5)使用CountDownLatch来控制多线程下的程序流程

并发控制(5)使用CountDownLatch来控制多线程下的程序流程 CountDownLatch和CyclicBarrier的区别,其实比较简单,CountDownLatch对执行任务的线程。比如...

我之见--java多线程CountDownLatch

倒计数的锁存器

Java多线程中的CountDownLatch

java.util.concurrent 包中的类CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountD...

java 多线程 CountDownLatch用法

CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 主要方法  public CountDownLatch(int cou...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程计数器之CountDownLatch和join
举报原因:
原因补充:

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