同步工具类包括信号量(Semaphore)、栅栏(barrier)、闭锁(CountDownLatch)
闭锁(CountDownLatch)
public class RunMain { public long timeTasks(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(); try { task.run(); } finally { endGate.countDown(); } } catch (InterruptedException e) { e.printStackTrace(); } }; }; t.start(); } long start = System.nanoTime(); startGate.countDown(); endGate.await(); long end = System.nanoTime(); return end - start; } }
FutrureTask
FutureTask也可以做闭锁,FutureTask表示的计算是通过Callable来实现的,相当于一种可生成结果的Runnable,并且可以处于一下3中状态
- 等待运行
- 正在运行
- 运行完成:表示计算的所有可能结束方式包括正常结束、由于取消而结束和由于异常而结束等。当FutureTask进入完成状态后,它会永远停止在这个状态上。
Future.get的行为取决于任务的状态,如果任务已经完成,那么get会立即返回结果,否则将阻塞知道完成状态,然后返回结果或者抛出异常。FutureTask将计算结果从执行计算的线程传递到获取这个结果的线程,而FutureTask的规范确保了这种传递过程能实现结果的安全发布。
public class RunMain { private FutureTask<String> future = new FutureTask<String>(new Callable<String>() { public String call() throws Exception { System.err.println("数据加载中"); Thread.sleep(3000); return "数据加载完成"; }; }); private Thread thread = new Thread(future); public void start() { thread.start(); } public String get() throws InterruptedException, ExecutionException { return future.get(); } public static void main(String[] args) throws InterruptedException, ExecutionException{ RunMain run = new RunMain(); run.start(); System.out.println(run.get()); } }
信号量(Semaphore)
计数信号量用来控制同时访问某个特定资源的操作数量,或者同时执行某个制定操作的数量,计数信号量还可以用来实现某种资源池或者对容器施加边界
public class RunMain<T> { private Set<T> set; private Semaphore sem; public RunMain(int bound) { set = Collections.unmodifiableSet(new HashSet<T>()); sem = new Semaphore(bound); } public boolean add(T t) throws InterruptedException { sem.acquire(); boolean boo = false; try { boo = set.add(t); return boo; } finally { if (!boo) sem.release(); } } public boolean remove(T t) { boolean boo = set.remove(t); if (boo) sem.release(); return boo; } }
栅栏(barrier)
所有线程必须同时到达栅栏的位置,才能继续执行,闭锁用于等待事件,而栅栏用于等待其他线程。
CyclicBarrier可以使一定数量的参与方反复地在栅栏位置聚集,它在并行迭代算法中非常有用。
代码摘自:http://www.cnblogs.com/dolphin0520/p/3920397.html
public class Test { public static void main(String[] args) { int N = 4; CyclicBarrier barrier = new CyclicBarrier(N,new Runnable() { @Override public void run() { System.out.println("当前线程"+Thread.currentThread().getName()); } }); for(int i=0;i<N;i++) new Writer(barrier).start(); } static class Writer extends Thread{ private CyclicBarrier cyclicBarrier; public Writer(CyclicBarrier cyclicBarrier) { this.cyclicBarrier = cyclicBarrier; } @Override public void run() { System.out.println("线程"+Thread.currentThread().getName()+"正在写入数据..."); try { Thread.sleep(5000); //以睡眠来模拟写入数据操作 System.out.println("线程"+Thread.currentThread().getName()+"写入数据完毕,等待其他线程写入完毕"); cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); }catch(BrokenBarrierException e){ e.printStackTrace(); } System.out.println("所有线程写入完毕,继续处理其他任务..."); } } }
相关推荐
主要参考资料:java并发编程的艺术、Java并发——同步工具类 二、CountDownLatch(同步倒数计数器)–不仅仅用于多线程 1.作用:允许一个或多个线程等待其他线程完成操作。 CountDownLatch的构造函数...
实现Nachos的同步机制:锁和条件变量,并利用这些同步机制实现几个基础工具类
NULL 博文链接:https://beck5859509.iteye.com/blog/1020574
使用Java开发的多线程下载工具,能实现以下功能: 1.支持HTTP和FTP 2.支持多任务同时下载 3.支持断点续传 4.支持多线程同步
国内首款FTP多线程同步扫描工具 - 全新4.1升级版 ◆ 扫描效率:多线程完美同步扫描,速度是其他产品10倍以上,无需多开! ◆ 高稳定性:程序运行稳定、资源消耗小,真正做到24小时无人看管扫描! ◆ 售后服务:专业...
NULL 博文链接:https://dr-yanglong.iteye.com/blog/1967574
详细介绍java并发编程相关知识: 基础知识 ...高级线程协作工具 信号量 闭锁 关卡 fork-join Executor部分 Executor基础 ThreadPoolExecutor的定制 线程的中断与任务的取消 其他
C#中的多线程 多线程 同步机制 同步工具类汇总
主要介绍了Java编程线程同步工具Exchanger的使用实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
JAVA毕业设计可以使用,实现了支持http和ftp,支持多任务同时下载,支持断点续传,支持多线程同步
本书的新版本展示了如何利用Java线程工具的全部优势,并介绍了JDK 2线程接口中的最新变化。你将学习如何使用线程来提高效率,如何有效地使用它们,以及如何避免常见的错误。本书讨论了死锁、竞态条件以及饥饿等问题...
java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ ... 同步工具类 原子操作类 AtomicInteger等 相当于加上synchronized 也有些利用硬件底层能力CAS
线程同步之临界区
JAVA并发编程-2-线程并发工具类一、Fork/Join1、分而治之与工作密取2、使用标准范式3、Fork/Join的同步用法4、Fork/Join的异步用法二、CountDownLatch三、CyclicBarrier四、Semaphore信号量五、Exchanger ...
多线程比较本地文件夹和远程文件夹文件,带有预估备份、同步需要的时间,进度条显示同步进度,列表显示文件备份情况。
进程与线程的通信与同步(理发师问题)的实现源代码,用互斥量实现的
假设存在两类进程:生产者,消费者。它们共享n个缓冲区。 生产者行为:生产产品(每次生产1个),并将产品放入空缓冲区,循环 往复,永不停息; 消费者行为:将产品从缓冲区中取出,进行消费(每次消费1个),循环 往复...
多线程的一个聊天工具,考虑的内容还是很全的,值得初学者参考
锁定排序 3.6 线程优先级 3.7 监控程序线程 3.8 在应用程序中加入线程 ...线程中的过时方法 3.12 DownloadFiles类 3.13 未捕捉的异常 3.14 自愿放弃处理器 3.15 并发工具 3.16 小结
Lock 接口和 ReentrantLock 类:提供更灵活的线程同步机制。 Executor 框架和线程池:用于管理和调度线程的执行。 通过合理地创建和管理线程,我们可以实现复杂的并发执行逻辑,提高程序的性能和响应能力,并确保...