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

几种同步工具介绍

    博客分类:
  • Java
阅读更多

下面的内容基本上来自于《Java并发编程实践》, 留个记录~

 

一,CountDownLatch

CountDownLatch是一个灵活的闭锁的实现,允许一个或多个线程等待一个事件集的发生。

闭锁的状态包括一个计数器,初始化为一个正数,用来表现需要等待的事件数。countDown方法对计数器做减操作,表示一个事件已经发生了,而await方法会一直阻塞直到计数器为0,或者等待线程中断以及超时。

 

下面是n个线程并发执行的例子

public class CountDownLatchTest {
	public long concurrentTasks(int nThreads, final Runnable task) throws InterruptedException {
		final CountDownLatch startGate = new CountDownLatch(1);
		final CountDownLatch endGate = new CountDownLatch(nThreads);
		
		for(int i = 0; i < nThreads; i ++) {
			Thread t = new Thread() {
				public void run() {
					try{
						startGate.await();
						task.run();
					} catch (InterruptedException e) {
						e.printStackTrace();
					} finally {
						endGate.countDown();
					}
				}
			};
			t.start();
		}
		
		long start= System.nanoTime();
		startGate.countDown();
		endGate.await();
		long end = System.nanoTime();
		return end - start;
	}
}

 上面的例子使用了两个阀门,一个“开始阀门”, 一个“结束阀门”。开始阀门将计数器初始化为1,结束阀门将计数器初始化为线程的数量。每一个工作线程做的第一件事是等待开始阀门的打开,这样能确保所有的线程都准备好再开始工作。每个线程的最后一件事是将结束阀门减1,这样是控制线程有效的等待,直到最后一个线程完成任务,这样就能计算线程整个的用时了。

 

二, FutureTask

FutureTask的计算通过Callable实现的,它等价于一个可以携带结果的Runnable,并且有3个状态: 等待,运行和完成。完成包括所有计算以任意的方式结束,包括正常、取消和异常。一旦FutureTask进入完成状态,将会永远停止在这个状态上。

Future.get的行为依赖于任务的状态。如果它已经完成,get可以立即得到结果,否则会阻塞直到任务转入完成状态,然后返回结果或抛出异常。FutureTask把计算的结果从运行计算的线程传送到需要这个结果的线程: FutureTask的规约保证了这种传递建立在结果的安全发布基础之上。

public class FutureTaskTest {
	private FutureTask<String> task = new FutureTask<String>(new Callable<String>() {
		@Override
		public String call() throws Exception {
			System.out.println("Thread name1: " + Thread.currentThread().getName());
			Thread.sleep(3000);
			return "AAA";
		}
	});
	
	public String invokeTask() throws InterruptedException, ExecutionException {
		String pattern = "HH:mm:ss";
		DateFormat format = new SimpleDateFormat(pattern);
		System.out.println("begin: " + format.format(new Date()));
		new Thread(task).start();
		System.out.println("Thread name2: " + Thread.currentThread().getName());
		String result = task.get();
		System.out.println("end: " + format.format(new Date()));
		System.out.println("result: " + result);
		return result;
	}
	
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		FutureTaskTest test = new FutureTaskTest();
		test.invokeTask();
	}
}

 运算的结果如下:

begin: 11:17:46
Thread name2: main
Thread name1: Thread-0
end: 11:17:49
result: AAA
由此可知,在执行get方法时,main线程等待FutureTask的计算结果,处于阻塞状态。

 

 

三, 信号量

信号量用来控制能够同时访问某特定资源的活动的数量,或者同时执行某一给定操作的数量。计数信号量可以用来实现资源池或者给一个容器限定边界。

信号量可以用来实现资源池,比如数据库连接池。有一个定长的池,当它为空时,你向它请求资源会失败。构建这种池很容易,然而当池为空时,你真正需要做的是阻塞它,然后在不为空时,再次解除阻塞。如果你以池的大小初始化一个Semaphore,在你从池中获取资源之前,你应该用acquire方法获取一个许可,调用release把许可放回资源池。acquire会一直阻塞,直到池不为空。

public class SemaphoreTest {
	private Semaphore semaphore;
	private List<String> stringList = new ArrayList<String>();

	public SemaphoreTest(int n) {
		semaphore = new Semaphore(n);
	}
	
	public void addElement(String ele) {
		try {
			semaphore.acquire();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		stringList.add(ele);
	}
	
	public String removeElement() {
		String ele = stringList.remove(stringList.size() - 1);
		semaphore.release();
		return ele;
	}
}

 

 

 

分享到:
评论

相关推荐

    文件同步工具 GoodSync Enterprise 10.5.6 + x64 中文企业免费版

    文件同步工具 GoodSync Enterprise 10.5.6 + x64 中文企业免费版。文件同步工具 GoodSync 中文版可以实现两台电脑或者电脑与U盘之间的数据和文件的同步转换。通过此工具,可以备份U盘中Pass2Go 中的数据或者其他文件...

    windows时间自动同步工具

    时间和日期显示根据用户的区域设置。精度通常在一秒钟内。TimeSync会尝试替代服务器,如果首选服务器获得时间不能。 TimeSync选项/自动提供从Windows任务计划程序运行TimeSync。...几种语言文件可供使用。

    时间同步工具timesync(免费解版)

    很好用的时间同步工具,很人性化,很好设置。我很喜欢。 软件名称: Express TimeSync v3.0.4 软件类别: 闹铃时钟 应用平台: Win9x/NT/2000/XP 开 发 商: http://www.express-computing.com/ 汉化作者: ...

    NTP Clock 服务器时间同步工具

    本程式 (NTPClock) 之功能最主要是透过网路读取 NTP 时间伺服器之标準时间,於电脑萤幕上显示标準时间,并可立即更新系统时鐘,以同步於标準时间。 程式主要外观说明 1.1. 具标题列及选单列之应用程式外观:若接...

    MySQL表中添加时间戳的几种方法

    主要介绍了MySQL表中添加时间戳的几种方法,有张表的数据需要用同步工具同步至其他库,需要 update_time 时间戳字段 来做增量同步,需要的朋友可以参考下

    Java多线程之并发工具类

    一、总论:在JDK中提供了几种并发工具类  1)CountDownLatch(同步倒数计数器:等待多线程(或者多步骤)完成)  2)CyclicBarrier(循环屏障:同步屏障)  3)Semaphore(信号量:控制并发进程数)  主要参考...

    all-things-cqrs:使用Spring工具同步两种状态的几种可能方式的综合指南。 通过在简单的CQRS应用程序中将命令和查询分开来显示同步

    万物CQRS 使用各种工具进行的方法。入门这些说明将为您提供有关如何同步两个不同数据源的概述。 我们将通过在一个简单的CQRS应用程序中将命令和查询分开来做到这一点。 每个模块代表引入此模式的不同方式。 而且,每...

    数字通信同步技术的MTALAB与FPGA实现》PPT版

    8.3.4 帧同步的几种状态 286 8.4 连贯式插入法帧同步的FPGA实现 287 8.4.1 实例要求及总体模块设计 287 8.4.2 搜索模块的VHDL实现及仿真 290 8.4.3 校核模块的VHDL实现及仿真 293 8.4.4 同步模块的VHDL实现及...

    异构数据源数据交换工具 DataX.zip

    DataX3.0 概览 DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。 设计理念 为了解决异构数据...

    Continual Sync:保持目录树重复项不断同步的工具-开源

    连续同步工具旨在在后台使用-设置一次就被遗忘了。 例如,它可以用于在没有用户交互的情况下将数百个Linux桌面备份到中央服务器,并且在原始桌面上更改几分钟后,更改就会出现在中央服务器上。 该软件包还包括“ ...

    EEG 的多变量相位同步分析:该包实现了几种用于 EEG 分析的通用相位同步测量。-matlab开发

    Payam Shahsavari Baboukani, Ghasem Azemi, Boualem Boashash, Paul Colditz, Amir Omidvarnia, 一种新的多变量相位同步测量:在多通道新生儿脑电图分析中的应用, 数字信号处理,第 84 卷,2019 年,第 59-68 页...

    微软分布式机器学习工具包DMTK.zip

    DMTK 是微软分布式机器学习工具包。DMTK 包括以下几个项目:DMTK framework(Multiverso): 参数服务器架构的机器学习LightLDA: 用于大规模主题模型的可扩展、快速、轻量级系统.Distributed word embedding:文字嵌入...

    Allway Sync(Windows文件同步软件)v19.0.3.zip

    同步方式有源文件夹同步和各向同步两种方式: 一、源文件夹同步方式将以一个文件夹为基准,删除或覆盖其余文件夹与源文件相比较不相同的文件。 二、各向同步方式则自动将更新的文件覆盖几个同步文件夹中的旧文件...

    教大家几种在Linux系统中查看时区的方法

    Linux 包含多种可用的时间管理工具,比如 date 或 timedatectlcommands,你可以用它们来获取当前系统时区,也可以将系统时间与 NTP 服务器同步,来...下面通过这篇文章来一起看看在Linux系统中查看时区的几种不同方法。

    navicat8_mysql_cs

    Navicat Navicat MySQL是一个强大的MySQL数据库服务器管理和开发工具。...它可以使用户连接到本地/远程服务器,提供了几种实用工具,例如数据结构同步、导入/导出、备份和报告,使维护数据的过程很容易。

    simple rdist rcs and tools , srtools:简单的rdist rcs和工具,srtools,同步-开源

    还有其他几种工具,请参见自述文件。 rcs工具有几样东西,例如“ late-checkins”来检查是否忘记了在dorev中强行检入/忘记检入的文件(避免使用复杂的选项)。 基于主机的文件是一种允许主机分发所有文件而不会破坏...

    Navicat8 MySQL CH.rar

    Navicat MySQL是一个强大的MySQL数据库服务器管理和开发工具。它可以与任何3.21或以上...它可以使用户连接到本地/远程服务器,提供了几种实用工具,例如数据结构同步、导入/导出、备份和报告,使维护数据的过程很容易。

    windows驱动开发技术详解-part2

     本章介绍了驱动程序中常用的同步处理办法,并且将内核模式下的同步处理方法和用户模式下的同步 处理方法做了比较。另外,本章还介绍了中断请求级、自旋锁等同步处理机制。  8.1 基本概念  8.1.1 问题的引出 ...

    Windows驱动开发技术详解的光盘-part1

     本章介绍了驱动程序中常用的同步处理办法,并且将内核模式下的同步处理方法和用户模式下的同步处理方法做了比较。另外,本章还介绍了中断请求级、自旋锁等同步处理机制。  8.1 基本概念  8.1.1 问题的引出  ...

Global site tag (gtag.js) - Google Analytics