`
m635674608
  • 浏览: 5042239 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java多线程同步器

    博客分类:
  • java
 
阅读更多

转自:

http://www.talentdigger.cn/home/space.php?uid=2189&do=thread&id=4129

 

--------------------------------------------我是分割线-----------------------------------

CyclcBarrier 
  在实际应用中,有时候需要多个线程同时工作以完成同一件事情,而且在完成过程中,往往会等待其他线程都完成某一阶段后再执行,等所有线程都到达某一个阶段后再统一执行。


  比如有几个旅行团需要途经深圳、广州、韶关、长沙最后到达武汉。旅行团中有自驾游的,有徒步的,有乘坐旅游大巴的;这些旅行团同时出发,并且每到一个目的地,都要等待其他旅行团到达此地后再同时出发,直到都到达终点站武汉。

CountDownLatch 
  一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

   用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。

Exchanger
   可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为 SynchronousQueue 的双向形式。  Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。 

  用法示例:以下是重点介绍的一个类,该类使用 Exchanger 在线程间交换缓冲区,因此,在需要时,填充缓冲区的线程获取一个新腾空的缓冲区,并将填满的缓冲区传递给腾空缓冲区的线程。 

复制代码
class FillAndEmpty {
Exchanger
<DataBuffer> exchanger =new Exchanger<DataBuffer>();
DataBuffer initialEmptyBuffer
= ... a made-up type
DataBuffer initialFullBuffer
= ...

class FillingLoop implements Runnable {
publicvoid run() {
DataBuffer currentBuffer
= initialEmptyBuffer;
try {
while (currentBuffer !=null) {
addToBuffer(currentBuffer);
if (currentBuffer.isFull())
currentBuffer
= exchanger.exchange(currentBuffer);
}
}
catch (InterruptedException ex) { ... handle ... }
}
}

class EmptyingLoop implements Runnable {
publicvoid run() {
DataBuffer currentBuffer
= initialFullBuffer;
try {
while (currentBuffer !=null) {
takeFromBuffer(currentBuffer);
if (currentBuffer.isEmpty())
currentBuffer
= exchanger.exchange(currentBuffer);
}
}
catch (InterruptedException ex) { ... handle ...}
}
}

void start() {
new Thread(new FillingLoop()).start();
new Thread(new EmptyingLoop()).start();
}
}
复制代码

 



SynchronousQueue
  一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因为仅在试图要取得元素时,该元素才存在;除非另一个线程试图移除某个元素,否则也不能(使用任何方法)添加元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的头 是尝试添加到队列中的首个已排队线程元素;如果没有已排队线程,则不添加元素并且头为 null。对于其他 Collection 方法(例如 contains),SynchronousQueue 作为一个空集合。此队列不允许 null 元素。

信号量semaphore

   Semaphore 信号量,就是一个允许实现设置好的令牌。也许有1个,也许有10个或更多。 
  谁拿到令牌(acquire)就可以去执行了,如果没有令牌则需要等待。 
  执行完毕,一定要归还(release)令牌,否则令牌会被很快用光,别的线程就无法获得令牌而执行下去了。

 

分享到:
评论

相关推荐

    Java分布式应用学习笔记05多线程下的并发同步器

    ### Java分布式应用学习笔记05多线程下的并发同步器 #### 1. 前言 在现代软件开发中,特别是在分布式系统和高性能计算领域,有效地管理多线程之间的协同工作至关重要。Java语言提供了丰富的工具和API来帮助开发者...

    Java多线程同步器代码详解

    Java多线程同步器在并发编程中扮演着至关重要的角色,它们帮助开发者管理线程间的协作,确保资源的正确访问和程序的顺序执行。本文将深入解析四种主要的同步器:CountDownLatch、Semaphore、Barrier和Exchanger,并...

    Java多线程下载器

    Java多线程下载器是一种利用Java编程语言实现的高效文件下载工具,它通过将大文件分割成多个部分并同时下载,显著提高了下载速度。在Java中实现多线程下载器涉及许多关键概念和技术,包括线程、并发控制、网络I/O...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    java多线程下载器

    Java多线程下载器是一种利用Java编程语言实现的高效文件下载工具,它通过将大文件分割成多个小部分,然后创建多个线程同时下载这些部分,以提高下载速度。这种技术在处理大文件或者网络带宽有限的情况下尤其有用,...

    java多线程简单下载器

    【Java多线程简单下载器】是一个初学者的编程作业,虽然代码可能较为混乱,但其核心功能已经实现,即通过多线程技术进行文件的下载。在Java中,多线程是并发处理的重要手段,它允许多个任务在同一时间执行,从而提高...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    java多线程进度条

    总之,实现Java多线程进度条涉及线程同步、共享数据更新以及UI更新的协调。理解这些核心概念,并根据具体需求选择合适的方法,是构建高效、用户友好进度条的关键。在ProgressTest这个示例项目中,你可能会找到更多...

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    JAVA多线程端口扫描器

    **JAVA多线程端口扫描器** 在计算机网络中,端口扫描是一种常见的技术,用于检测目标主机上开放的服务和应用程序。此项目是基于Java语言实现的多线程端口扫描器,它允许用户对本地系统或指定的远程IP地址进行快速...

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

    书中详细介绍了Java多线程的核心概念,如线程的创建、启动、同步、协作以及生命周期管理。读者将学习如何通过实现Runnable接口或继承Thread类来创建线程,以及如何使用Executor框架来管理线程池。 此外,书中还深入...

    java 多线程 同步详解

    Java多线程同步详解 在Java编程中,多线程是一种常见的并发执行方式,它可以提高程序的执行效率,充分利用CPU资源。然而,多线程环境下数据的安全性问题不容忽视,这就引出了Java中的同步机制。本文将深入探讨Java...

    java多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    本文将深入探讨Java多线程中的关键知识点,包括创建线程、主线程、线程优先级、线程组、线程同步以及线程间的通信。 1. **创建线程** 在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。...

    JAVA单线程多线程

    `synchronized`是Java中用于实现线程同步的关键字之一。它可以用来修饰方法或者代码块,确保被修饰的代码在同一时刻只能被一个线程访问。这是Java实现线程安全的一种基本手段。 ##### 使用synchronized修饰方法 当...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    java 多线程示例

    Java多线程是Java编程中的重要概念,尤其在开发高性能、高并发的应用中不可或缺。本示例旨在为初学者提供一个全面理解Java多线程的起点。通过学习这个实例,你可以掌握如何创建和管理线程,理解线程同步与通信的重要...

    Java多线程练习题

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...

    java http多线程下载器

    Java HTTP多线程下载器是一种优化的网络资源下载工具,它利用Java编程语言实现了HTTP协议的下载功能,并结合多线程技术以提高下载速度。在本文中,我们将深入探讨Java HTTP多线程下载器的工作原理、核心概念以及实现...

    Java多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...

Global site tag (gtag.js) - Google Analytics