1. package com.demo.test3;
  2.  
  3. import java.util.concurrent.CountDownLatch;
  4.  
  5. /**
  6. * @author QQ: 1236897
  7. *
  8. */
  9. //闭锁
  10. //nThread - 线程数目
  11. //startGate -确保所有线程就绪-》countDown->所有线程工作
  12. //endGate - 等待所有线程完成工作后才返回timeTask方法
  13. public class CountDownLockTest {
  14.  
  15. /**
  16. * @param args
  17. */
  18. public static void main(String[] args) {
  19. // TODO Auto-generated method stub
  20. Caller caller = new Caller();
  21. MyTask task = new MyTask();
  22.  
  23. try {
  24. System.out.println(caller.timeTask(5, task));
  25. } catch (InterruptedException e) {
  26. // TODO Auto-generated catch block
  27. e.printStackTrace();
  28. }
  29. }
  30.  
  31. }
  32.  
  33. class Caller {
  34.  
  35. public long timeTask(int nThreads, final Runnable task)
  36. throws InterruptedException {
  37.  
  38. final CountDownLatch startGate = new CountDownLatch(1);
  39. final CountDownLatch endGate = new CountDownLatch(nThreads);
  40.  
  41. for (int i = 0; i < nThreads; i++) {
  42. Thread t = new Thread() {
  43.  
  44. public void run() {
  45. try {
  46. System.out.println("startGate await");
  47. startGate.await();
  48. try {
  49. task.run();
  50. } finally {
  51. endGate.countDown();
  52. }
  53.  
  54. } catch (InterruptedException e) {
  55. }
  56. }
  57.  
  58. };
  59.  
  60. t.start();
  61. }
  62.  
  63. long start = System.nanoTime();
  64. System.out.println("startGate countDown");
  65. startGate.countDown();
  66. endGate.await();
  67. long end = System.nanoTime();
  68. System.out.println("return");
  69. return end - start;
  70. }
  71.  
  72. }
  73.  
  74. class MyTask implements Runnable {
  75.  
  76. /*
  77. * (non-Javadoc)
  78. *
  79. * @see java.lang.Runnable#run()
  80. */
  81. @Override
  82. public void run() {
  83. // TODO Auto-generated method stub
  84. System.out.println("id sleep: - " + Thread.currentThread().getId());
  85. try {
  86. Thread.sleep(5000);
  87. System.out.println("Sleep done: - "
  88. + Thread.currentThread().getId());
  89. } catch (InterruptedException e) {
  90. // TODO Auto-generated catch block
  91. Thread.currentThread().interrupt();
  92. }
  93. }
  94.  
  95. }

java_线程-锁的更多相关文章

  1. NSLock线程锁的使用测试

    测试1:NSLock线程锁是不是单例? 打印: 结论1:NSLock不是单例 测试2:同一个线程锁在不同的地方锁定,是否会有锁定两个? 打印为: 结论2:顺序打印,在不同的地方锁定也可以锁定. 测试3 ...

  2. day9---多线程,线程锁,队列

    进程.线程 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 使用threading模块实现多线程编程[综述] Pyt ...

  3. python线程锁

    import time,threading balance = 0 lock = threading.Lock() def change_it(n): global balance balance = ...

  4. linux下使用线程锁互斥访问资源

    linux使用线程锁访问互斥资源: 1.线程锁的创建 pthread_mutex_t g_Mutex; 2.完整代码如下 #include <stdio.h> #include <s ...

  5. JAVA线程锁-读写锁

    JAVA线程锁,除Lock的传统锁,又有两种特殊锁,叫读写锁ReadWriteLock 其中多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥 例子: /** * java线程锁分为读写锁 ReadWri ...

  6. Java线程锁一个简单Lock

    /** * @author * * Lock 是java.util.concurrent.locks下提供的java线程锁,作用跟synchronized类似, * 单是比它更加面向对象,两个线程执行 ...

  7. python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

    python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

  8. Linux同步机制(一) - 线程锁

    1 互斥锁 在线程实际运行过程中,我们经常需要多个线程保持同步. 这时可以用互斥锁来完成任务.互斥锁的使用过程中,主要有 pthread_mutex_init pthread_mutex_destor ...

  9. 单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式-b

    1.单利模式概述 链接:  iOS开发懒汉模式&恶寒模式 2.使用GCD实现单利模式 2.1新建一个project,然后新建一个HMDataTool类展示GCD实现单例模式 #import & ...

随机推荐

  1. opencv行人检测里遇到的setSVMDetector()问题

    参考了博客http://blog.csdn.net/carson2005/article/details/7841443 后,自己动手后发现了一些问题,博客里提到的一些问题没有解决 ,是关于为什么图像 ...

  2. 机器学习真的可以起作用吗?(2)(以二维PLA算法为例)

    一个问题:大多数情况下,M(hypothesis set的大小)是无穷大的,例如PLA算法.那么是不是我们的原则1就不能使用了? 我们试着做一些努力: Step1:寻找hypothesis set的e ...

  3. YARN应用场景、原理与资源调度

    1.Hadoop YARN产生背景 源于MapReduce1.0 运维成本 如果采用“一个框架一个集群”的模式,则可能需要多个管理员管理这些集群,进而增加运维成本,而共享模式通常需要少数管理员即可完成 ...

  4. snprintf 返回值

    在平时写代码的过程中,我一个推荐带有n系列的字符串函数,如 strcat ->strncat sprintf->snprintf 我们有类似的一个函数 void dump_kid(std: ...

  5. Java设计模式系列之状态模式

    状态模式(State)的定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它 ...

  6. DelphiXE Android自适应屏幕办法

    相关资料: http://www.delphitop.com/html/FireMonkey/2658.html http://bbs.csdn.net/topics/390919460 1.Scal ...

  7. HDU 5794 A Simple Chess (容斥+DP+Lucas)

    A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...

  8. MSGPACK(一)

    MSGPACK跨平台的数据序列规范,为多种语言所支持.用它序列还是还原数据都异常方便. 而且它支持序列的数据格式非常之多,因为它支持的数据格式多,所以MSGPACK的第二功用:缓存. DELPHI的M ...

  9. << 移位运算

    /** * The maximum capacity, used if a higher value is implicitly specified * by either of the constr ...

  10. android WebView将新浪天气为我所用 ------>仅供娱乐

    新浪天气提供了一个网页     http://w.sina.com 浏览器访问: 这效果还可以了哦,直接用webview加载出来,效果也可以了哦,不过,这不是我要的.我不希望在我写的应用里到处铺满si ...