`
udvs
  • 浏览: 14909 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

CountDownLatch 简单学习

阅读更多
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.atomic.AtomicInteger;

public class TestCountDownLatch {
    private static List<String>  mans      = new ArrayList<String>();
    private static CyclicBarrier barrier   = null;
    private static AtomicInteger costTimes = new AtomicInteger(0);

    static {
        mans.add("andy");
        mans.add("jack");
        mans.add("lili");
        mans.add("alan");
        mans.add("bill");
        //barrier = new CyclicBarrier(mans.size() + 1);
    }

    public static class Walk implements Runnable {
        private AtomicInteger  ct = new AtomicInteger(0);
        private String         name;
        private CountDownLatch latch;

        public Walk(String name, AtomicInteger countTime, CountDownLatch cdl) {
            ct = countTime;
            this.name = name;
            //            latch = cdl;
        }

        @Override
        public void run() {
            int walkTime = new Random().nextInt(20);
            try {
                if ("lili".equals(name)) {
                    Thread.sleep(10000);
                } else
                    Thread.sleep(1000);
            } catch (InterruptedException e) {

            }
            System.out.println(name + " walk " + walkTime + "min");

            // ct.addAndGet(walkTime);
            //            try {
            //                // barrier.await();
            //                latch.countDown();
            //            } catch (Exception e) {
            //
            //            }

            System.out.println(name + " walk over!");
            System.out.println("all person walk " + ct.addAndGet(walkTime));
        }

    }

    public static class Walk1 implements Callable<Integer> {
        private String name;

        public Walk1(String n) {
            this.name = n;
        }

        @Override
        public Integer call() {
            int walkTime = new Random().nextInt(20);
            try {
                if ("lili".equals(name)) {
                    Thread.sleep(10000);
                } else
                    Thread.sleep(1000);
            } catch (InterruptedException e) {

            }
            System.out.println(name + " walk " + walkTime + "min");
            return walkTime;
        }

    }

    public static void main(String[] args) throws Exception {
        //        try {
        //            CountDownLatch latch = new CountDownLatch(mans.size());
        //            ExecutorService es = Executors.newFixedThreadPool(mans.size());
        //            for (String str : mans) {
        //                es.submit(new Walk(str, costTimes, latch));
        //            }
        //
        //            es.shutdown();
        //            // latch.await();
        //            //barrier.await();
        //            System.out.println("TOTAL COST:" + costTimes + "min");
        //        } catch (Exception e) {
        //            System.out.println(e.getMessage());
        //        } finally {
        //
        //        }

        List<Future<Integer>> tasks = new ArrayList<Future<Integer>>();
        ExecutorService es = Executors.newFixedThreadPool(mans.size());
        for (String str : mans) {
            Walk1 w = new Walk1(str);
            FutureTask<Integer> f = new FutureTask<Integer>(w);
            tasks.add(f);
            es.submit(f);
        }

        es.shutdown();
        Integer costTimes = 0;
        for (Future<Integer> f : tasks) {
            costTimes += f.get();
        }

        System.out.println("TOTAL COST:" + costTimes + "min");
    }
}


计算几个人跑步总时间。。。
分享到:
评论

相关推荐

    Java CountDownLatch完成异步回调实例详解

    在本文中,我们将学习如何使用 CountDownLatch 来完成异步回调实例,并探讨相关的知识点。 CountDownLatch 的工作原理 CountDownLatch 的工作原理基于计数器的概念。它维护一个计数器,初始值是指定的整数。每当一...

    java环境搭建和学习,基础知识点,学习路线,学习路径,集合,并发,框架,jvm

    并发是Java的强项,Java提供了丰富的并发API,如Thread、Runnable、ExecutorService、Semaphore、CountDownLatch等。理解线程同步、死锁、活锁、阻塞队列等概念,是编写高效并发程序的关键。 Java框架如Spring、...

    JAVA 学习成长路线:从入门到精通的技术成长分享.docx

    开始学习 Java 的第一步是编写一个简单的 Hello World 程序: ```java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } ``` #### (2)基本语法...

    java学习笔记基础和框架

    Java是一种广泛使用的面向对象的编程语言,它的设计目标是具有简单性、面向对象、健壮性、安全性、可移植性等特点。这份“java学习笔记基础和框架”涵盖了从Java的基础概念到高级特性的全方位学习资料,非常适合初学...

    Java学习笔记(必看经典).doc

    它的设计目标是具有简单性、面向对象、健壮性、安全性、可移植性、高性能和多线程等特性。这份“Java学习笔记(必看经典).doc”文档将涵盖Java的核心概念和重要知识点,对于初学者和有经验的开发者来说都是宝贵的参考...

    JAVA开发学习资料包.zip

    - **并发工具类**:如Semaphore、CyclicBarrier、CountDownLatch等的使用。 5. **IO与NIO** - **流的概念**:掌握字节流和字符流,以及输入流和输出流的分类。 - **缓冲区**:理解BufferedReader、...

    api文档学习手册

    - **多线程**:Java提供了Thread类和Runnable接口来实现多线程,同时并发工具类如Semaphore、CountDownLatch等有助于多线程间的同步和协调。 3. **高级特性** - **反射**:通过Class类和相关API,可以在运行时...

    Java学习课件

    6. **多线程**:Java内置对多线程的支持,学习如何创建和管理线程,同步机制(如synchronized关键字、wait()、notify()方法)以及并发工具类(如ExecutorService、Semaphore、CountDownLatch)。 7. **反射**:反射...

    javademo学习啦啦啦

    Java的并发库提供了丰富的工具,如ExecutorService、Semaphore和CountDownLatch,帮助开发者编写高效的多线程程序。 最后,Java还提供了网络编程的API,如Socket和ServerSocket,用于创建客户端和服务器应用程序,...

    java 技术学习文档2

    其设计目标是简单性、面向对象、健壮性、安全性以及高效性。 2. **Java环境配置**:学习Java首先需要安装Java Development Kit (JDK),设置JAVA_HOME环境变量,并配置PATH和CLASSPATH,以便在命令行中执行Java程序...

    2021 Java学习路线,已助我成功拿到offer(csdn)————程序.pdf

    - **并发工具类**:如Semaphore, CyclicBarrier, CountDownLatch等,用于协调多个线程的执行。 - **并发编程模式**:如生产者消费者模型,线程池等。 4. **函数式编程** - **Lambda表达式**:理解其语法和使用,...

    java线程api学习文档

    在Java中,线程的实现使得这种并发编程变得相对简单和可移植。 线程API主要包含在Java的`java.lang.Thread`类和`java.util.concurrent`包中。`Thread`类是创建和管理线程的基础,而`java.util.concurrent`包提供了...

    Java架构面试专题汇总(含答案)和学习笔记.zip

    - **并发工具类**:如Semaphore、CountDownLatch、CyclicBarrier等的使用场景。 - **并发容器**:了解ConcurrentHashMap、ConcurrentLinkedQueue等并发安全的集合。 6. **JVM** - **内存模型**:理解堆、栈、...

    Spring Boot 个人实例项目,主要用于个人初代java优化及相关算法及初代神经网络自主学习程序的了解及学习展示.zip

    4. **并发优化**:使用线程池管理线程,避免频繁创建销毁,利用并发工具类如 CountDownLatch、CyclicBarrier 等协调多线程执行。 5. **数据库优化**:优化 SQL 查询,减少 JOIN,使用索引,批量插入数据,合理设计...

    java线程 线程学习资料 java线程教程

    - **学习成果**: 学习者能够掌握编写简单的多线程程序的能力,并能够理解和分析使用线程的基本程序。 #### 二、线程基础知识 - **线程定义**: 在计算机科学中,线程是指程序执行流的一个单元,是操作系统调度的基本...

    [Java程序设计实用教程(第5版)][叶核亚][电子教案(PPT版本)].zip.zip

    9. **多线程**:理解并发编程的基础,如线程的创建、同步机制(synchronized关键字、Lock接口)、线程池的使用,以及并发工具类如CountDownLatch、CyclicBarrier等。 10. **网络编程**:掌握Socket编程,理解TCP和...

    JAVA6学习文集-精彩内容汇总

    9. **并发工具**:Java 6引入了`java.util.concurrent`包,包含各种并发工具类,如ExecutorService、Semaphore、CountDownLatch等,帮助开发者更有效地编写多线程程序。 10. **XML处理**:Java 6中的JAXB(Java ...

    线程学习一 源代码

    本教程将带你进行最简单的线程入门学习。 在Java中,创建线程主要有两种方式:继承Thread类和实现Runnable接口。下面我们将详细探讨这两种方法。 1. 继承Thread类 当创建一个新的线程时,你可以选择让新的类继承自...

    简单的线程代码编写,初学入门,

    本文将深入探讨“简单的线程代码编写”,帮助初学者理解线程的基本概念和如何在代码中实现。 线程是操作系统分配CPU时间片的基本单元,一个进程可以包含多个线程。它们共享同一块内存空间,但各自拥有独立的运行栈...

    Java SE 全部学习练习代码和小的应用程序

    练习代码中可能包括同步机制(synchronized关键字、wait()、notify()、notifyAll())、线程池(ExecutorService、ThreadPoolExecutor)以及并发工具类(如Semaphore、CountDownLatch)的使用。 7. **反射机制**:...

Global site tag (gtag.js) - Google Analytics