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");
}
}
计算几个人跑步总时间。。。
分享到:
相关推荐
在本文中,我们将学习如何使用 CountDownLatch 来完成异步回调实例,并探讨相关的知识点。 CountDownLatch 的工作原理 CountDownLatch 的工作原理基于计数器的概念。它维护一个计数器,初始值是指定的整数。每当一...
并发是Java的强项,Java提供了丰富的并发API,如Thread、Runnable、ExecutorService、Semaphore、CountDownLatch等。理解线程同步、死锁、活锁、阻塞队列等概念,是编写高效并发程序的关键。 Java框架如Spring、...
开始学习 Java 的第一步是编写一个简单的 Hello World 程序: ```java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } ``` #### (2)基本语法...
Java是一种广泛使用的面向对象的编程语言,它的设计目标是具有简单性、面向对象、健壮性、安全性、可移植性等特点。这份“java学习笔记基础和框架”涵盖了从Java的基础概念到高级特性的全方位学习资料,非常适合初学...
它的设计目标是具有简单性、面向对象、健壮性、安全性、可移植性、高性能和多线程等特性。这份“Java学习笔记(必看经典).doc”文档将涵盖Java的核心概念和重要知识点,对于初学者和有经验的开发者来说都是宝贵的参考...
- **并发工具类**:如Semaphore、CyclicBarrier、CountDownLatch等的使用。 5. **IO与NIO** - **流的概念**:掌握字节流和字符流,以及输入流和输出流的分类。 - **缓冲区**:理解BufferedReader、...
- **多线程**:Java提供了Thread类和Runnable接口来实现多线程,同时并发工具类如Semaphore、CountDownLatch等有助于多线程间的同步和协调。 3. **高级特性** - **反射**:通过Class类和相关API,可以在运行时...
6. **多线程**:Java内置对多线程的支持,学习如何创建和管理线程,同步机制(如synchronized关键字、wait()、notify()方法)以及并发工具类(如ExecutorService、Semaphore、CountDownLatch)。 7. **反射**:反射...
Java的并发库提供了丰富的工具,如ExecutorService、Semaphore和CountDownLatch,帮助开发者编写高效的多线程程序。 最后,Java还提供了网络编程的API,如Socket和ServerSocket,用于创建客户端和服务器应用程序,...
其设计目标是简单性、面向对象、健壮性、安全性以及高效性。 2. **Java环境配置**:学习Java首先需要安装Java Development Kit (JDK),设置JAVA_HOME环境变量,并配置PATH和CLASSPATH,以便在命令行中执行Java程序...
- **并发工具类**:如Semaphore, CyclicBarrier, CountDownLatch等,用于协调多个线程的执行。 - **并发编程模式**:如生产者消费者模型,线程池等。 4. **函数式编程** - **Lambda表达式**:理解其语法和使用,...
在Java中,线程的实现使得这种并发编程变得相对简单和可移植。 线程API主要包含在Java的`java.lang.Thread`类和`java.util.concurrent`包中。`Thread`类是创建和管理线程的基础,而`java.util.concurrent`包提供了...
- **并发工具类**:如Semaphore、CountDownLatch、CyclicBarrier等的使用场景。 - **并发容器**:了解ConcurrentHashMap、ConcurrentLinkedQueue等并发安全的集合。 6. **JVM** - **内存模型**:理解堆、栈、...
4. **并发优化**:使用线程池管理线程,避免频繁创建销毁,利用并发工具类如 CountDownLatch、CyclicBarrier 等协调多线程执行。 5. **数据库优化**:优化 SQL 查询,减少 JOIN,使用索引,批量插入数据,合理设计...
- **学习成果**: 学习者能够掌握编写简单的多线程程序的能力,并能够理解和分析使用线程的基本程序。 #### 二、线程基础知识 - **线程定义**: 在计算机科学中,线程是指程序执行流的一个单元,是操作系统调度的基本...
9. **多线程**:理解并发编程的基础,如线程的创建、同步机制(synchronized关键字、Lock接口)、线程池的使用,以及并发工具类如CountDownLatch、CyclicBarrier等。 10. **网络编程**:掌握Socket编程,理解TCP和...
9. **并发工具**:Java 6引入了`java.util.concurrent`包,包含各种并发工具类,如ExecutorService、Semaphore、CountDownLatch等,帮助开发者更有效地编写多线程程序。 10. **XML处理**:Java 6中的JAXB(Java ...
本教程将带你进行最简单的线程入门学习。 在Java中,创建线程主要有两种方式:继承Thread类和实现Runnable接口。下面我们将详细探讨这两种方法。 1. 继承Thread类 当创建一个新的线程时,你可以选择让新的类继承自...
本文将深入探讨“简单的线程代码编写”,帮助初学者理解线程的基本概念和如何在代码中实现。 线程是操作系统分配CPU时间片的基本单元,一个进程可以包含多个线程。它们共享同一块内存空间,但各自拥有独立的运行栈...
练习代码中可能包括同步机制(synchronized关键字、wait()、notify()、notifyAll())、线程池(ExecutorService、ThreadPoolExecutor)以及并发工具类(如Semaphore、CountDownLatch)的使用。 7. **反射机制**:...