0 0

多线程并发5

实现的功能如下,  相约一起去烧烤:可能其中一方先到,另一方后到。 两个都到了之后,才一起去。
使用 java.util.concurrent.CountDownLatch 怎么保证两个线程同时到了,注意,这里有一个身份的判断,两个是之前相约的两个人?
如果是,两个共同的CountDownLatch分别调用countDown()方法,最后 await()等待确认两个都到了,才一起去。

这里关键怎么处理身份判断 和 两个人一个countDownlatch  这个要怎么处理?

问题补充:
OpenMind 写道
你是不是想干下面的事情啊?

public class Person extends Thread {
	static Random random = new Random();
	private String name;
	private CountDownLatch cdl;

	public Person(String name, CountDownLatch cdl) {
		super();
		this.name = name;
		this.cdl = cdl;
	}

	public void walk() {
		try {
			// 每个人行走的时间随机,0-5秒
			Thread.sleep(Math.abs(random.nextInt() % 5000));
		} catch (InterruptedException e) {
			// ignore
		}
	}

	private void await() {
		cdl.countDown();
		try {
			cdl.await();// 如果有人每到,一直到所有人到了以后在继续
		} catch (InterruptedException e) {
		}
	}

	public void 烧烤() {
		System.out.println(name + " starting 烧烤");
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// ignore
		}
	}

	public void run() {
		// 走一段时间
		walk();
		// 等等看还有没有人每到,
		await();
		//
		烧烤();
	}

	public static void main(String[] args) {
		int personCount = 10;
		CountDownLatch cdl = new CountDownLatch(10);
		for (int i = 0; i < personCount; i++) {
			new Person("men " + i, cdl).start();
		}
	}

}

你这个这样处理我知道,关键是  来到你面前的很多人,你怎么判断他是你的伙伴,两个人共用一个CountDownLatch或者其他的线程并发处理类来处理这个逻辑。
2012年2月15日 10:12

2个答案 按时间排序 按投票排序

0 0

你是不是想干下面的事情啊?


public class Person extends Thread {
	static Random random = new Random();
	private String name;
	private CountDownLatch cdl;

	public Person(String name, CountDownLatch cdl) {
		super();
		this.name = name;
		this.cdl = cdl;
	}

	public void walk() {
		try {
			// 每个人行走的时间随机,0-5秒
			Thread.sleep(Math.abs(random.nextInt() % 5000));
		} catch (InterruptedException e) {
			// ignore
		}
	}

	private void await() {
		cdl.countDown();
		try {
			cdl.await();// 如果有人每到,一直到所有人到了以后在继续
		} catch (InterruptedException e) {
		}
	}

	public void 烧烤() {
		System.out.println(name + " starting 烧烤");
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// ignore
		}
	}

	public void run() {
		// 走一段时间
		walk();
		// 等等看还有没有人每到,
		await();
		//
		烧烤();
	}

	public static void main(String[] args) {
		int personCount = 10;
		CountDownLatch cdl = new CountDownLatch(10);
		for (int i = 0; i < personCount; i++) {
			new Person("men " + i, cdl).start();
		}
	}

}

2012年2月15日 15:17
0 0

可以先为两人包装成一个组, 如 (伪码描述)
class Team {
   CountDownLatch cdl = new CountDownLatch(2); // 这个组共同的countDownlatch 
   People p;// 这个组先到的那个人
}

然后用一个List记录所有已经到了一个人的组
List waitingTeams = [];

当一个人到的时候,遍历这个List 判断有没有同组人在等自己
如果没有: 说明自己是先到的, 建一个新的team并放到List里, 然后等待队友
如果有: 将team从List里删除, 然后唤醒队友, 继续
-----
其实我觉得应该用CyclicBarrier

2012年2月15日 12:52

相关推荐

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...

    基于Qt的多线程并发服务器

    "基于Qt的多线程并发服务器"是一个典型的解决方案,它利用了Qt库的强大功能,特别是其对多线程的支持,来处理来自多个客户端的并发请求。下面我们将深入探讨这个主题。 首先,Qt是一个跨平台的应用程序开发框架,...

    WEBAPI多线程并发测试工具

    标题"WEBAPI多线程并发测试工具"指出,这是一个专门针对Web API进行多线程并发测试的工具。Web API通常指的是应用程序接口,它们允许不同的服务之间进行通信,以实现数据交换和功能整合。多线程并发测试则是验证在多...

    多线程并发处理的简单实现

    在编程领域,多线程并发处理是一种常见的优化技术,它能充分利用多核处理器的资源,提高程序的执行效率。在给定的标题“多线程并发处理的简单实现”中,我们可以深入探讨如何构建这样的系统。 首先,多线程并发处理...

    多线程并发技术

    在现代软件开发中,多线程并发技术是提高程序性能和响应速度的关键因素之一。随着计算机硬件的性能持续提升,程序也必须能够有效地利用多核处理器来实现真正的并行处理。JVM(Java虚拟机)作为Java应用程序的运行...

    模拟摄像头libuv支持多线程并发

    在IT行业中,模拟摄像头与多线程并发处理是两个重要的技术领域,特别是在视频通信和网络编程中。本文将深入探讨“模拟摄像头libuv支持多线程并发”这一主题,结合“模拟IPC”这一标签,以及文件名称“IpcSimulate”...

    Tesseract OCR多线程并发识别案例

    在处理大量图像或需要快速响应时间的应用场景中,多线程并发识别可以显著提升效率。以下将详细介绍如何利用Tesseract OCR实现多线程并发识别,以及可能涉及的相关技术点。 首先,理解Tesseract OCR的基本工作原理是...

    Linux下基于socket多线程并发通信的实现.pdf

    "Linux下基于socket多线程并发通信的实现" 本文主要探讨Linux操作系统下基于socket多线程并发通信的实现。 socket是UNIX系统开发中的网络通信接口,可以对台计算机之间的通信规范进行合理定义,从而达到通信的目的...

    java多线程并发

    ### Java多线程并发知识点详解 #### 一、Java多线程并发简介 在现代软件开发中,特别是在Java这样的主流编程语言中,多线程并发技术是提高程序执行效率、优化资源利用的关键手段之一。本篇文章将深入探讨Java中的...

    多线程并发处理数据的问题

    在IT行业中,多线程并发处理数据是一种常见的优化策略,特别是在大数据处理、网络服务和分布式系统中。通过并发,可以充分利用多核处理器的计算能力,提高程序执行效率,缩短任务的总体完成时间。本篇文章将深入探讨...

    多线程并发服务器(毕业设计)

    在IT领域,多线程并发服务器是网络编程中的一个重要概念,尤其在高并发场景下,如网站、在线游戏和实时数据处理系统等。这个毕业设计的主题是“多线程并发服务器”,采用C++语言实现,这表明我们将在讨论中涵盖C++...

    JAVA多线程并发编程

    但同时,多线程并发也会引入一些问题,如数据竞争和同步问题。 为了解决这些问题,Java提供了多种同步机制。`synchronized`关键字用于控制对共享资源的访问,确保同一时间只有一个线程可以执行特定代码块,从而避免...

    支持多线程并发与消息异步处理的Linux Netlink通信机制研究.pdf

    "支持多线程并发与消息异步处理的Linux Netlink通信机制研究" Linux操作系统中,Netlink是一种流行的进程间通信机制,用于实现用户空间和内核空间之间的通信。然而,在多线程程序中使用Netlink时,仍然存在一些问题...

    java socket 多线程并发控制 hibernate mysql

    本项目聚焦于使用Java的Socket进行多线程并发控制,并结合Hibernate ORM框架与MySQL数据库进行数据存储。下面将详细阐述这些技术及其应用。 首先,Java Socket是Java提供的用于实现网络上不同计算机间进程通信的...

    JDK5中的多线程并发库.doc

    在JDK5中,Java引入了一套强大的多线程并发库,极大地提升了多线程编程的效率和安全性。这个库提供了丰富的类和接口,使得开发者能够更好地控制线程的执行、同步和通信。 1. **线程** - **线程与进程的关系**:...

    多线程并发和设计模式学习笔记(代码)

    多线程并发从,学习笔记,代码+注释,从线程创建开始到多线程并发,相关锁以及一些设计模式等

    java多线程并发编程知识导图笔记.xmind

    java多线程并发编程知识导图笔记.xmind

    在IntelliJ IDEA中多线程并发代码的调试方法详解

    多线程并发代码的调试方法详解 在多线程并发编程中,调试是一件很复杂的事情,特别是在使用 IntelliJ IDEA 等集成开发环境时。今天,我们将详细介绍如何在 IntelliJ IDEA 中调试多线程并发代码。 在多线程并发编程...

    多线程并发下的单例模式-源码

    该资源是多线程并发下的单例模式-源码,几乎包含了所有方式实现的单例模式,并且能够确保在多线程并发下的线程安全性。 读者可结合本人博客 http://blog.csdn.net/cselmu9?viewmode=list 中的《线程并发之单例模式...

    java多线程并发控制[参照].pdf

    java多线程并发控制[参照].pdf

Global site tag (gtag.js) - Google Analytics