`
zengshaotao
  • 浏览: 787422 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

多线程之 CountDownLatch

 
阅读更多

package function.thread;

 

import java.util.concurrent.CountDownLatch;  

/** 

 * 示例:CountDownLatch的使用举例 

 * CountDownLatch是一个功能强大且易于使用的对象,主要适用于

 * 当前线程必须等待一个或多个事件发生的时候

 */  

public class TestCountDownLatch {  

    private static final int N = 10;

  

    public static void main(String[] args) throws InterruptedException {  

        CountDownLatch doneSignal = new CountDownLatch(N);  

        CountDownLatch startSignal = new CountDownLatch(1);//开始执行信号  

  

        for (int i = 1; i <= N; i++) {

        //线程启动后,处于就绪状态

            new Thread(new Worker(i, doneSignal, startSignal)).start();//线程启动了  

        }  

        System.out.println("begin------------");

        //子线程都调用了await方法,所以当前线程不变更计数器,子线程就会被阻塞

        startSignal.countDown();//计数器大于0,线程被阻塞。另外,阻塞并不等于线程执行完毕

        //sleep太久,子线程可能都执行完毕了

        Thread.sleep(10);//为了更好地看到各线程的竞争,否则可能是主线程一直先执行如下语句

        System.out.println(" 我是主线程,也是线程。我也会加入到和子线程竞争的队伍中.....");

        //此处可以是当前线程的阻塞点

        doneSignal.await();//当前线程等待所有的线程执行完毕  

        

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

  

    }  

  

    static class Worker implements Runnable {  

        private final CountDownLatch doneSignal;  

        private final CountDownLatch startSignal;  

        private int beginIndex;  

  

        Worker(int beginIndex, CountDownLatch doneSignal,  

                CountDownLatch startSignal) {  

            this.startSignal = startSignal;  

            this.beginIndex = beginIndex;  

            this.doneSignal = doneSignal;  

        }  

  

        public void run() {  

            try {

            //防止主线程未执行,而子线程先执行的情况,

            //所以任何子线程都要先等待

                startSignal.await(); //等待开始执行信号的发布,每个线程都会不断的检测放行的信号  

                beginIndex = (beginIndex - 1) * 10 + 1;  

                for (int i = beginIndex; i <= beginIndex + 10; i++) {  

                    System.out.println(Thread.currentThread().getName()+":"+i);  

                }

                Thread.sleep(5000);

                System.out.println(Thread.currentThread().getName()+" wake up......");  

            } catch (InterruptedException e) {  

                e.printStackTrace();  

            } finally {  

                doneSignal.countDown();  

            }  

        }  

    }  

}  

 

 

运行结果:

 

begin------------

Thread-3:31

Thread-3:32

Thread-0:1

Thread-3:33

Thread-0:2

Thread-0:3

Thread-0:4

Thread-0:5

Thread-0:6

Thread-0:7

Thread-0:8

Thread-1:11

Thread-1:12

Thread-1:13

Thread-1:14

Thread-1:15

Thread-1:16

Thread-9:91

Thread-8:81

Thread-8:82

Thread-1:17

Thread-4:41

Thread-4:42

Thread-4:43

Thread-4:44

Thread-4:45

Thread-4:46

Thread-4:47

Thread-4:48

Thread-4:49

Thread-4:50

Thread-4:51

Thread-0:9

Thread-0:10

Thread-0:11

Thread-6:61

Thread-5:51

Thread-6:62

Thread-6:63

Thread-6:64

Thread-2:21

Thread-2:22

Thread-2:23

Thread-2:24

Thread-2:25

Thread-2:26

Thread-2:27

Thread-7:71

Thread-3:34

Thread-7:72

Thread-3:35

Thread-2:28

Thread-6:65

Thread-5:52

Thread-1:18

Thread-1:19

Thread-1:20

Thread-8:83

Thread-8:84

Thread-9:92

Thread-8:85

Thread-1:21

Thread-5:53

Thread-6:66

Thread-2:29

Thread-3:36

Thread-7:73

Thread-3:37

Thread-2:30

Thread-2:31

Thread-6:67

Thread-6:68

Thread-5:54

Thread-8:86

Thread-9:93

Thread-9:94

Thread-8:87

Thread-5:55

Thread-5:56

Thread-6:69

Thread-3:38

Thread-7:74

Thread-3:39

Thread-6:70

Thread-5:57

Thread-8:88

Thread-9:95

Thread-8:89

Thread-5:58

Thread-5:59

Thread-5:60

Thread-5:61

Thread-6:71

Thread-3:40

Thread-7:75

Thread-3:41

Thread-8:90

Thread-9:96

Thread-8:91

Thread-7:76

Thread-9:97

Thread-9:98

Thread-9:99

Thread-9:100

Thread-7:77

Thread-9:101

Thread-7:78

Thread-7:79

Thread-7:80

Thread-7:81

 我是主线程,也是线程。我也会加入到和子线程竞争的队伍中.....

Thread-4 wake up......

Thread-0 wake up......

Thread-1 wake up......

Thread-2 wake up......

Thread-3 wake up......

Thread-6 wake up......

Thread-8 wake up......

Thread-5 wake up......

Thread-9 wake up......

Thread-7 wake up......

main thread end 。。。。。。

 

 

 

分享到:
评论

相关推荐

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    本文将详细介绍如何利用MyBatis结合多线程和CountDownLatch闭锁来实现数据的批量插入。 首先,我们来看`mybatis批处理`。MyBatis的批处理功能允许我们在一次数据库连接中执行多条SQL语句,从而减少了数据库连接的...

    多线程countDownLatch方法介绍

    在Java多线程编程中,CountDownLatch是一个非常重要的同步工具类,它可以帮助我们协调多个线程之间的交互。本文将深入探讨CountDownLatch的工作原理、使用场景以及相关源码分析。 CountDownLatch是一个计数器,初始...

    利用 CountDownLatch 类实现线程同步

    在多线程编程中,确保一组操作按照特定的顺序或者所有操作都完成后再进行下一步是常见的需求。Java 提供了多种工具来实现这样的同步机制,其中之一便是 `CountDownLatch` 类。`CountDownLatch` 是一个计数器,可以...

    JAVA多线程CountDownLatch使用详解

    JAVA多线程CountDownLatch使用详解 JAVA多线程CountDownLatch是JAVA多线程编程中的一种同步工具,主要用来让某个线程等待其他线程执行完毕后再继续执行。下面我们将详细介绍JAVA多线程CountDownLatch的使用和原理。...

    java使用CountDownLatch等待多线程全部执行完成

    Java 使用 CountDownLatch 等待多线程全部执行完成 CountDownLatch 是 Java 中的一个同步工具类,允许一个或多个线程等待其他线程完成操作。它的应用场景非常广泛,例如在处理大量数据时,可以使用多线程的方式处理...

    多线程并行执行,汇总结果

    "CountDownLatch" 和 "Thread" 是Java编程语言中实现多线程并行执行的关键工具,它们有助于提高程序的运行效率和响应速度。 **多线程并行执行** 多线程并行执行是指在同一个程序中同时运行多个线程,每个线程负责...

    Java多线程编程之CountDownLatch同步工具使用实例

    在Java多线程编程中,CountDownLatch是一种常用的同步工具,用于协调多个线程之间的协作,确保它们按照特定的顺序执行或者等待所有线程完成特定任务后再继续执行。这个类是java.util.concurrent包的一部分,提供了...

    JAVAJAVA多线程教学演示系统论文

    《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...

    如何使用CountDownLatch同步java多线程

    如何使用CountDownLatch同步java多线程 CountDownLatch 是 Java 并发编程中的一种常用工具,用于控制多个线程的并发执行。它可以实现多个线程之间的同步操作,使得线程之间可以协调工作,避免了线程之间的互相干扰...

    多线程终极案例程序(多线程进阶)

    在IT行业中,多线程是Java编程中一个重要的高级特性,尤其对于开发高效能和响应迅速的应用至关重要。这个“多线程终极案例程序”旨在帮助Java开发者深化对多线程的理解,通过一个具体的“多兵种联合攻击防御塔”游戏...

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

    java多线程文件传输

    - **CountDownLatch**:允许一个线程等待其他线程完成操作,常用于多线程并发测试。 - **CyclicBarrier**:允许多个线程等待直到达到某个屏障点再一起继续执行。 - **Semaphore**:信号量,控制同时访问特定资源...

    线程池管理多线程上传

    线程池管理和多线程上传是并发编程中的一个重要实践,特别是在大数据传输和网络服务中。在Java等编程语言中,线程池通过有效地管理和复用线程资源,避免了频繁创建和销毁线程带来的开销,提升了系统性能。下面将详细...

    java实现多线程文件传输

    9. **并发工具类**:`CountDownLatch`、`CyclicBarrier`和`Semaphore`等并发工具类可以帮助控制线程的启动和同步,提高多线程操作的协调性。 10. **安全性**:在多线程环境下,文件操作需注意文件锁,避免同一时刻...

    多线程demo/java多线程练习

    - **CountDownLatch**:常用于多线程间的同步,计数器从正整数开始,每当一个线程完成任务,计数器减一,当计数器为零时,所有等待的线程将被释放。 - **CyclicBarrier**:允许一组线程等待彼此到达某个屏障点,...

    poi多线程大数据导出excel文件.zip

    本项目“poi多线程大数据导出excel文件”提供了一个解决方案,利用多线程来提高Excel的大数据导出效率。 Apache POI 3.1版本是较早的版本,而项目中使用了更新的4.1版本,这意味着它可能利用了更多优化和新特性。在...

    Java中CountDownLatch进行多线程同步详解及实例代码

    Java中CountDownLatch进行多线程同步详解及实例代码 CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对...

    Java_多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...

    多线程demo程序-轻松掌握多线程技术

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在服务器端开发和高并发应用中,多线程能够充分利用CPU资源,提高程序的运行效率。这个名为"多线程demo程序-轻松掌握多线程技术"的项目,旨在帮助开发者理解...

    多线程,高并发.zip

    在IT领域,多线程和高并发是两个关键概念,特别是在Java编程中,它们对于构建高效、可扩展的系统至关重要。下面将详细解释这两个概念及其在Java中的实现和应用。 多线程是指在一个应用程序中同时运行多个独立的执行...

Global site tag (gtag.js) - Google Analytics