java并发编程:同步工具类
来源:互联网 发布:腾讯mac管家 编辑:程序博客网 时间:2024/06/06 20:22
闭锁(CountDownLatch)
- 闭锁就相当于一个大门,只有等所有线程都到达之后,门才会开。例如:我约了其它三个人一起打麻将,之后等我们四个人都到了之后,才能开始打麻将。
private static void testCountDownLatch() { final CountDownLatch start = new CountDownLatch(1); final CountDownLatch end = new CountDownLatch(3); new Thread() { @Override public void run() { try { start.await(); System.out.println("CountDownLatch Thread1 working..."); } catch (InterruptedException e) { e.printStackTrace(); } finally { end.countDown(); } } }.start(); new Thread() { @Override public void run() { try { start.await(); System.out.println("CountDownLatch Thread2 working..."); } catch (InterruptedException e) { e.printStackTrace(); } finally { end.countDown(); } } }.start(); new Thread() { @Override public void run() { try { start.await(); System.out.println("CountDownLatch Thread3 working..."); } catch (InterruptedException e) { e.printStackTrace(); } finally { end.countDown(); } } }.start(); System.out.println("CountDownLatch Threads start..."); start.countDown(); try { end.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("CountDownLatch Threads finish..."); }
FutureTask
- FutureTask的get方法,如果还没运行结束时,会一直阻塞,直到有结果。
private static void testFutureTask() { FutureTask<String> future = new FutureTask<String>(new Callable<String>() { @Override public String call() throws Exception { return "FutureTask test..."; } }); try { future.run(); System.out.println(future.get()); } catch (Exception e) { e.printStackTrace(); } }
Semaphore信号量
- 信号量在使用时,要先获取信号量,如果获取到了,才能继续执行,否则将一直阻塞,直到获取到信号量。
private static void testSemaphore() { Semaphore semaphore = new Semaphore(1); try { semaphore.acquire(); System.out.println("Semaphore test..."); semaphore.release(); } catch (Exception e) { e.printStackTrace(); } }
栅栏
- 栅栏跟闭锁有点类似。不过闭锁是等待外部事件的触发,而栅栏是所有线程相互等待,直到某个点,栅栏才打开。
public class TestBarrier { private Board mainBoard; private CyclicBarrier barrier; private int nums = 5; private int dealCount = 0; public TestBarrier(final int cpuNum) { mainBoard = new Board(); barrier = new CyclicBarrier(cpuNum, new Runnable() { @Override public void run() { dealCount += cpuNum; if (dealCount != nums) { System.out.println("数据尚未处理完..."); } else { System.out.println("Result=" + mainBoard.getResult()); } } }); for (int i = 0; i < cpuNum; i++) { new Thread(new Worker(mainBoard, i + 1)).start(); } } /** * 具体算法 * * @author HuangXiquan * */ private class Worker implements Runnable { private Board board; private int number;// 要计算的数值 public Worker(Board board, int number) { this.board = board; this.number = number; } @Override public void run() { System.out.println("Worker compute number=" + number); board.setResult(number - 1, number * number); try { barrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } } private class Board { private int[] result = new int[nums]; public void setResult(int index, int value) { result[index] = value; } public int getResult() { int value = 0; for (int i = 0; i < result.length; i++) { value += result[i]; } return value; } } public static void main(String[] args) { int cpuNum = Runtime.getRuntime().availableProcessors(); System.out.println("cpuNum=" + cpuNum); new TestBarrier(cpuNum); }}
1 0
- Java高并发编程:同步工具类
- java并发编程:同步工具类
- java并发编程(四)同步工具类
- Java 并发编程(四)常用同步工具类
- JAVA 并发编程-线程同步工具类(十二)
- Java并发编程类学习五(同步工具)
- 【5】Java并发编程:线程同步工具之CountDownLatch类
- JAVA 并发编程-线程同步工具类(十二)
- java并发编程:自定义同步工具
- Java并发编程(五)《并发工具类》
- Java并发之同步工具类
- java并发——同步工具类
- Java并发中常用同步工具类
- Java多线程并发编程之构建自定义同步工具
- java并发编程实战-构建自定义的同步工具
- java并发编程-同步类容器-ArrayBlockingQueue
- Java并发编程基础构建模块(05)——同步工具类
- Java并发编程基础构建模块(05)——同步工具类
- SDL2 事件
- 老生常谈,正确使用memset
- 总动循环播放长图片
- 图标设计思路
- kubernetes 1.2版弹性伸缩HPA
- java并发编程:同步工具类
- ExtJS6.2 Hello MVC 实例 web开发
- Java快速排序算法
- 保存图片到sd卡之后在相册显示
- 使用springmvc提交put请求时提示 Request method 'POST' not supported
- java 内存流 利用内存流复制文件
- Hive的几种常见的数据导入方式
- 分布式事务学习(一)
- 使用Jquery实现顶部导航栏在页面滑动到自身所在位置之后固定在顶部的效果