java多线程之闭锁(CountDownLatch)、同步屏幕(CyclicBarrier)、信号量(Semaphore)

简介: 闭锁CountDownLatch若有多条线程,其中一条线程需要等到其他所有线程准备完所需的资源后才能运行,这样的情况可以使用闭锁。import java.util.concurrent.

闭锁CountDownLatch

若有多条线程,其中一条线程需要等到其他所有线程准备完所需的资源后才能运行,这样的情况可以使用闭锁。

import java.util.concurrent.CountDownLatch;

/**
 * Created by chenjianan on 2017/1/17-15:11.
 * <p>
 * Describe: CountDownLatch 闭锁练习,
 * 使用场景:若有多条线程,其中一条线程要等其他线程执行完才能执行,那么可以用闭锁;
 * 闭锁只会阻塞一条线程,目的是为了让该条任务线程满足条件后执行;
 */
public class CountDownLatchTest {


    public void test(){


        CountDownLatch latch=new CountDownLatch(2);//初始化闭锁,并设置资源数目

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 本线程必须等待所有资源加载完后才能执行
                    latch.await();
                    // 当闭锁数量为0时,await返回,执行接下来的任务
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程3执行。。。。");
            }
        }).start();



        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程2执行。。。。");
                System.out.println("线程2执行。。。。"+latch.getCount());
                // 本资源加载完后,闭锁-1
                latch.countDown();
                System.out.println("线程2执行。。。。"+latch.getCount());
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程1执行。。。。");
                System.out.println("线程1执行。。。。"+latch.getCount());
                // 本资源加载完后,闭锁-1
                latch.countDown();
                System.out.println("线程1执行。。。。"+latch.getCount());
            }
        }).start();

    }


    public static void main(String[] args){
        new CountDownLatchTest().test();
    }
}


//执行结果
线程2执行。。。。
线程2执行。。。。2
线程2执行。。。。1
线程1执行。。。。
线程1执行。。。。1
线程1执行。。。。0
线程3执行。。。。

CyclicBarrier 同步屏幕


import java.util.concurrent.CountDownLatch;

/**
 * Created by chenjianan on 2017/1/17-15:11.
 * <p>
 * Describe: CountDownLatch 闭锁练习,
 * 使用场景:若有多条线程,其中一条线程要等其他线程执行完才能执行,那么可以用闭锁;
 * 闭锁只会阻塞一条线程,目的是为了让该条任务线程满足条件后执行;
 */
public class CountDownLatchTest {


    public void test(){


        CountDownLatch latch=new CountDownLatch(2);//初始化闭锁,并设置资源数目

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 本线程必须等待所有资源加载完后才能执行
                    latch.await();
                    // 当闭锁数量为0时,await返回,执行接下来的任务
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程3执行。。。。");
            }
        }).start();



        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程2执行。。。。");
                System.out.println("线程2执行。。。。"+latch.getCount());
                // 本资源加载完后,闭锁-1
                latch.countDown();
                System.out.println("线程2执行。。。。"+latch.getCount());
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程1执行。。。。");
                System.out.println("线程1执行。。。。"+latch.getCount());
                // 本资源加载完后,闭锁-1
                latch.countDown();
                System.out.println("线程1执行。。。。"+latch.getCount());
            }
        }).start();

    }


    public static void main(String[] args){
        new CountDownLatchTest().test();
    }
}


//执行结果
线程1执行。。。。await前
线程2执行。。。。await前
线程3执行。。。。await前
到达屏幕后执行的任务、。。
线程3执行。。。。await后
线程1执行。。。。await后
线程2执行。。。。await

信号量Semaohore


/**
 * Created by chenjianan on 2017/1/17-17:06.
 * <p>
 * Describe: 信号量
 * 使用场景
 * 若有m个资源,但有n条线程(n>m),因此同一时刻只能允许m条线程访问资源,此时可以使用Semaphore控制访问该资源的线程数量。
 */
public class SemaphoreTest {
    public void  test() {
        // 创建信号量对象,并给予3个资源
        Semaphore semaphore = new Semaphore(3);

        // 开启10条线程
        for (int i = 0; i < 10; i++) {

           new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        // 获取资源,若此时资源被用光,则阻塞,直到有线程归还资源
                        semaphore.acquire();
                        System.out.println("执行任务"+ Thread.currentThread().getName());
                        System.out.println("释放资源"+ Thread.currentThread().getName());
                        // 释放资源
                        semaphore.release();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();

        }

    }

    public static void main(String[] args){
        new SemaphoreTest().test();
    }
}
相关文章
|
10月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
441 1
|
10月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
411 1
|
11月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
645 100
|
11月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
460 0
|
11月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
633 16
|
12月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
538 83
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
496 0