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();
    }
}
相关文章
|
2天前
|
安全 C++
C++多线程编程:并发与同步
C++多线程编程:并发与同步
7 0
|
17天前
|
监控 安全 Java
一文讲明白Java中线程与进程、并发与并行、同步与异步
一文讲明白Java中线程与进程、并发与并行、同步与异步
8 1
|
24天前
|
安全 算法 Java
Java中的多线程并发控制与同步机制
【4月更文挑战第17天】 在现代软件开发中,Java作为一种广泛使用的编程语言,其对多线程的支持是构建高性能应用程序的关键。本文将深入探讨Java中的多线程并发控制与同步机制,包括基本的线程创建、生命周期管理,以及高级的并发工具如synchronized关键字、ReentrantLock类、并发集合和原子变量等。通过理论分析与实例演示,旨在为读者提供一个清晰的多线程并发控制与同步的实现框架,并指出在实践中如何避免常见的并发问题,如死锁、竞态条件和资源争用等。
|
24天前
|
安全 Java 开发者
Java中的多线程并发控制与同步机制
【4月更文挑战第17天】在Java编程中,多线程是实现并行处理和提高程序性能的重要手段。然而,随之而来的线程安全问题和数据一致性问题不容忽视。本文深入剖析了Java中多线程的并发控制与同步机制,包括synchronized关键字、显式锁Lock以及并发集合等高级特性。通过对比分析这些机制的原理和使用场景,旨在帮助开发者理解并合理运用于实际项目中,以解决并发环境下的数据竞争和资源冲突问题。
|
1月前
|
Java 物联网 开发者
Java中的多线程并发控制与同步机制
【4月更文挑战第11天】随着计算机技术的飞速发展,多线程编程在现代软件开发中扮演着越来越重要的角色。本文将深入探讨Java语言中的多线程并发控制与同步机制,包括线程的创建、启动、运行以及终止,重点分析synchronized关键字、wait()和notify()方法以及Lock锁等同步工具的使用。通过实例演示如何在实际开发中应用这些技术,以提高程序的性能和稳定性。
|
1月前
|
安全 Java 开发者
Java中的多线程并发控制与同步机制
【4月更文挑战第3天】 在现代计算机科学中,多线程编程是实现高效并发处理的核心技术之一。Java作为一种广泛应用的编程语言,提供了丰富的多线程支持和并发控制机制。本文将深入探讨Java语言中的多线程概念、并发控制方法以及同步机制,包括synchronized关键字、显式锁Lock以及并发集合等。我们将通过理论分析结合实例代码,阐述如何在Java中正确使用这些工具来优化程序性能,并确保数据的一致性和线程安全。
|
1月前
|
安全 Java
Java中的并发编程:探索多线程同步与锁机制
在Java编程领域,多线程并发编程是一个重要而又复杂的话题。本文将深入探讨Java中的多线程同步与锁机制,包括synchronized关键字、ReentrantLock类以及java.util.concurrent包中的各种并发工具,帮助读者更好地理解和应用多线程编程技术。
9 1
|
7月前
|
设计模式 缓存 Java
Java多线程线程池:提升应用性能的终极利器
Java多线程线程池:提升应用性能的终极利器
574 0
|
5月前
|
Java 调度
Java多线程:什么是线程池(ThreadPool)?
Java多线程:什么是线程池(ThreadPool)?
49 0
|
2天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
10 1