利用线程池,同步线程实现并发

1、CountDownLatch html

同步工具类,容许一个或多个线程等待,直到其余的线程操做完成后在执行。java

如何工做:多线程

CountDownLatch是经过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了本身的任务后,计数器的值就会减1。当计数器值到达0时,它表示全部的线程已经完成了任务,而后在闭锁上等待的线程就能够恢复执行任务。并发

使用场景:iphone

1.实现最大的并行性:有时咱们想同时启动多个线程,实现最大程度的并行性。例如,咱们想测试一个单例类。若是咱们建立一个初始计数为1的CountDownLatch,并让全部线程都在这个锁上等待,那么咱们能够很轻松地完成测试。咱们只需调用 一次countDown()方法就可让全部的等待线程同时恢复执行。工具

2.开始执行前等待n个线程完成各自任务:例如应用程序启动类要确保在处理用户请求前,全部N个外部系统已经启动和运行了。测试

3。死锁检测:一个很是方便的使用场景是,你可使用n个线程访问共享资源,在每次测试阶段的线程数目是不一样的,并尝试产生死锁。this

 

2、使用countdownlach 和ExecutorService 线程池 编写并发spa

 countdownlach 同步计数设置为1,countDown 则线程并发.net

package com.cyd.util.netty;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * countdownlach 和线程池完成并发 应用场景:一、最大并发。二、执行前等待N线程执行完成。 三、模拟锁死。
 * 
 * @author chenyd 2017年11月29日
 */
public class Concurrent {

    public static void main(String[] args) {
        int threadNum = 5;
        CountDownLatch countd = new CountDownLatch(1);// 同步线程数
        ExecutorService threadPool = Executors.newFixedThreadPool(threadNum);// 线程池
        for (int i = 0; i < threadNum; i++) {
            threadPool.execute(new ChildThread(i,countd));
        }
        try {
            System.out.println("等待添加....");
            Thread.sleep(1000);
            System.out.println("并发....");
            countd.countDown();
        
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
            // 关闭线程池,中止全部正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。
            // threadPool.shutdownNow();
        }
    }

}

class ChildThread implements Runnable {
    private int num;
    private CountDownLatch countd;
    public ChildThread(){};
    public ChildThread(int num,CountDownLatch countd) {
        this.num = num;
        this.countd=countd;
    };

    public void run() {
        try {
            countd.await();
            // 使当前线程在锁存器倒计数至零以前一直等待,除非线程被中断或超出了指定的等待时间。
            // latch.await(long timeout, TimeUnit unit);
            System.out.println("子线程:" + num);
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //当前计算工做结束,计数器减一
            
            try {
                //Thread.sleep(10);
            } catch (Exception e) {
                e.printStackTrace();
            }
             //执行coutDown()以后,继续执行本身的工做,不受主线程的影响
            System.out.println("子线程"+num+"继续执行,不受影响");
        }
    }

}

 

参考连接:

何时使用CountDownLatchhttp://www.importnew.com/15731.html

java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例http://blog.csdn.net/javaloveiphone/article/details/54729821

相关文章
相关标签/搜索