文档章节

java的concurrent包工具类

GITTODO
 GITTODO
发布于 2016/03/28 17:09
字数 663
阅读 88
收藏 3

java的concurrent包工具类

        concurrent的工具包类主要用来协调不同线程的运行状态(完成状态、完成步调)、对同步资源的访问限制。

1、CountDownLatch

        countDownLatch是通过一个计数器来实现线程的统一执行。首先给latch设置一个初始值,countDown() 每被调用一次,设定的初始值会减1。在设定值达到0之前,使用latch. await() 的线程会一直阻塞。知道latch.countDown()将设定值减为0,latch.wait()线程才会运行。

public class cdlTest {

	public static void main(String[] args) throws InterruptedException {
		CountDownLatch latch = new CountDownLatch(3);
		Waiter waiter = new Waiter(latch);
		Decrementer decrementer = new Decrementer(latch);

		new Thread(waiter).start();
		new Thread(decrementer).start();
	}

}

class Waiter implements Runnable {
	CountDownLatch latch = null;

	public Waiter(CountDownLatch latch) {
		this.latch = latch;
	}

	@Override
	public void run() {
		System.out.println(" waiter is begin");
		try {
			latch.wait();
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(" Waiter Released");
	}

}

class Decrementer implements Runnable {
	CountDownLatch latch = null;

	public Decrementer(CountDownLatch latch) {
		this.latch = latch;
	}

	@Override
	public void run() {
		System.out.println(" Decrementer is begin");
		try {
			Thread.sleep(1000);
			this.latch.countDown();
			System.out.println(" Decrementer down 1");
			Thread.sleep(1000);
			this.latch.countDown();
			System.out.println(" Decrementer down 2");
			Thread.sleep(1000);
			this.latch.countDown();
			System.out.println(" Decrementer down 3");
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(" Decrementer is release ");
	}

}

2、Cyclicbarrier

        循环屏障:会将所有在这个锁定队列中的线程都按顺序执行。当awite()等时候,线程进入等待队列,然后等所有的线程(线程数是CyclicBarrier里的参数)。

public class CycliTest {

	private static int[] timeWalk = { 5, 8, 15, 15, 10 };
	private static int[] timeSelf = { 1, 3, 4, 4, 5 };
	private static int[] timeBus = { 2, 4, 6, 6, 7 };

	static String now() {
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
		return sdf.format(new Date()) + ":";
	}

	static class Tour implements Runnable {

		private int[] times;
		private CyclicBarrier barrier;
		private String tourName;

		public Tour(CyclicBarrier barrier, String tourName, int[] times) {
			this.times = times;
			this.barrier = barrier;
			this.tourName = tourName;
		}

		@Override
		public void run() {
			try {
				Thread.sleep(times[0] * 100);
				System.out.println(now() + tourName + " Reached Shenzhen ");
				barrier.await();
				Thread.sleep(times[1] * 100);
				System.out.println(now() + tourName + " Reached Guangzhou ");
				barrier.await();
				Thread.sleep(times[2] * 100);
				System.out.println(now() + tourName + " Reached Shaoguan ");
				barrier.await();
				Thread.sleep(times[3] * 100);
				System.out.println(now() + tourName + " Reached Chengdu ");
				barrier.await();
				Thread.sleep(times[4] * 100);
				System.out.println(now() + tourName + " Reached Wuhan");
				barrier.await();
			} catch (BrokenBarrierException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		}

	}

	public static void main(String[] args) {
		CyclicBarrier barrier = new CyclicBarrier(3);
		ExecutorService exec = Executors.newCachedThreadPool();
		exec.submit(new Tour(barrier, "WalkTour", timeWalk));
		exec.submit(new Tour(barrier, "SelfTour", timeSelf));
		exec.submit(new Tour(barrier, "BusTour", timeBus));
		exec.shutdown();
	}
}

3、Semaphore

        一个信号量。由于我们的锁都是加在semaphore上的,只有等semaphore有空闲的时候,等待线程才会继续执行。对限制线程个数的操作的共享资源可以使用。

public class MyTest extends Thread {

	private Semaphore semaphore;

	public MyTest(Semaphore s) {
		this.semaphore = s;
	}

	public void run() {
		try {
			if (semaphore.availablePermits() > 0) {
				System.out.println("thread name [" + this.getName() + "] can take");
			} else {
				System.out.println(" thread name [" + this.getName() + "] must waite");
			}
			semaphore.acquire();//获取
			System.out.println("thread name[" + this.getName() + "] get resource");
			Thread.sleep((long) (Math.random() * 1000));
			System.out.println("thread name[" + this.getName() + "] release resource");
			semaphore.release();//释放
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		ExecutorService es = Executors.newCachedThreadPool();
		Semaphore s = new Semaphore(2);
		for (int i = 0; i < 50; i++) {
			es.submit(new MyTest(s));
		}
		es.shutdown();
	}

}


© 著作权归作者所有

GITTODO

GITTODO

粉丝 25
博文 138
码字总数 197485
作品 0
程序员
私信 提问
Hibernate jar包介绍

hibernate-core-4.3.0.Final.jar(Hibernate的核心库,必须使用的jar)+ cglib-asm.jar(cglib库,Hibernate用它来实现PO字节码的动态生成,非常核心的库,必须使用的jar)+ dom4j.jar(dom...

拷贝忍者卡卡习
2017/01/13
65
0
Java 7 的新特性一览表

官方说是 7月28日 正式发布 Java 7 ,正常的话我们应该在 7月29日 看到这个版本。很快了,就两天时间。 发布之前让我们先来看看 Java 7 都有什么新特性吧。 Java 7 的架构图: 新特性一览表:...

红薯
2011/07/27
77.3K
83
读书笔记之《Java并发编程的艺术》-并发编程容器和框架(重要)

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
661
1
Java 11 正式发布,带来ZGC、Http Client等重要特性!

Java 11 已经正式发布,官网下载:https://www.oracle.com/technetwork/java/javase/downloads/index.html 。 我们知道,从 Java 9 开始,JDK 就采用了新的发布模型,每 6 个月发布一个新版本...

开发资讯
2018/09/26
0
0
JAXB 应用指南

文章转自:http://blog.csdn.net/darxin/article/details/4845820 JAXB(Java Architecture for XML Binding)是一种特殊的序列化/反序列化工具。它可以使XML数据以Java Objects的形式直接应...

红薯
2011/08/06
4.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
7
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
昨天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
昨天
2.7K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部