JAVA里也有强大的信号量工具Semaphore,使用信号量可以很方便的实现线程同步功能,以解决类似于 生产者——消费者 之类的典型问题。

下面是我的测试程序,大部分看注释就可以明白用法:

  1. import java.util.LinkedList;
  2. import java.util.Queue;
  3. import java.util.concurrent.Semaphore;
  4.  
  5. public class TestSemaphore {
  6.  
  7. /**
  8. * 测试主程序
  9. */
  10. public static void main(String[] args) {
  11. TestSemaphore t = new TestSemaphore();
  12. t.runTest();
  13. }
  14.  
  15. //TestSemaphore
  16. /**信号量*/
  17. private Semaphore mSem = new Semaphore(0);
  18. /**产生的产品队列*/
  19. private Queue<String> mQueue = new LinkedList<String>();
  20.  
  21. /**
  22. * 进行测试
  23. */
  24. public void runTest() {
  25. Runnable runProvider = new Runnable() {
  26. @Override
  27. public void run() {
  28. provider();
  29. }
  30. };
  31.  
  32. Runnable runCustomer = new Runnable() {
  33. @Override
  34. public void run() {
  35. customer();
  36. }
  37. };
  38.  
  39. new Thread(runCustomer).start();
  40. new Thread(runProvider).start();
  41.  
  42. while(true) {
  43. try {
  44. Thread.sleep(300);
  45. } catch (InterruptedException e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. }
  50.  
  51. /**
  52. * 生产者线程
  53. */
  54. public void provider() {
  55. for(int i = 0; i < 10; i++) {
  56.  
  57. //生成一个产品,放到队列里
  58. String p = String.format("product_%d", i);
  59. mQueue.offer(p);
  60. System.out.println(String.format("Send sig >>>>>>>>>>>>> %s", p));
  61.  
  62. //发出信号量
  63. mSem.release();
  64.  
  65. try {
  66. Thread.sleep(300);
  67. } catch (InterruptedException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. }
  72.  
  73. /**
  74. * 消费者线程
  75. */
  76. public void customer() {
  77. while(true) {
  78. //等待信号量
  79. try {
  80. mSem.acquire();
  81. } catch (InterruptedException e) {
  82. e.printStackTrace();
  83. }
  84.  
  85. //从队列里取出一个产品
  86. String s = mQueue.poll();
  87. System.out.println(String.format("Get sig : %s", s));
  88.  
  89. try {
  90. Thread.sleep(500);
  91. } catch (InterruptedException e) {
  92. e.printStackTrace();
  93. }
  94. }
  95. }
  96.  
  97. }

JAVA信号量使用示例程序的更多相关文章

  1. Java代理模式示例程序

    Java代理模式示例程序 当然不是我想出来的,是我看的一个网上教程里的. 模拟的是一个对电脑公司的代理 真实类的接口: public interface SaleComputer { public S ...

  2. epub、ocf等常用电子书格式浅析----附JAVA示例程序

    一. 电子书介绍 转载请注明http://www.cnblogs.com/xckk/p/6020324.html Epub(Electronic Publication)是一个完全开放和免费的电子书标 ...

  3. BitCoinJ之Hello World示例程序

    简介 比特币(BitCoin)是一种基于区块链(BlockChain)技术的数字化货币. 本文介绍了使用基于Java语言的BitCoinJ API实现一个简单的收取和支付比特币的示例程序. 开发环境 ...

  4. RocketMQ消费者示例程序

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 本博客实现了一个简单的RocketMQ消费者的示例,MQ里存储的是经过Avro序列化的消息数据,程序读取数据并反序列化后, ...

  5. RocketMQ生产者示例程序

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 本示例展示了一个RocketMQ producer的简单实现,通过解析文本文件获取输入数据,将数据经过Avro序列化后发送 ...

  6. [译]Java Thread Sleep示例

    Java Thread Sleep示例 java.lang.Thread sleep(long millis)方法被用来暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒.注意参数不能为负数,否则 ...

  7. [译]Java Thread join示例与详解

    Java Thread join示例与详解 Java Thread join方法用来暂停当前线程直到join操作上的线程结束.java中有三个重载的join方法: public final void ...

  8. Ruby简介,附带示例程序

    Ruby语言是日本人松本行弘于1993年器开始着手研发,经历2年时间,发布了Ruby语言的第一个版本:0.95版.     Ruby是一种非常简介的解释性语言,一种纯粹的面向对象编程语言,甚至比Jav ...

  9. delphi7编写客户端调用java服务器端webservice示例

    1. 首先取得java-webservice服务器端地址.我的是:http://localhost:8080/mywebservice/services/mywebservice?wsdl 2. 然后 ...

随机推荐

  1. struts2中<s:property>的用法

    1,访问Action值栈中的普通属性: <s:property value="attrName"/> 2,访问Action值栈中的对象属性(要有get set方法):  ...

  2. bzoj2748:[HAOI2012]音量调节

    思路:刷水有益健康. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  3. C++ GUI Qt4编写的文本编辑器

    mainwindow.h: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMenu> #include <QAction& ...

  4. Make和Makefile

    无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型 ...

  5. 【仿携程JQuery日期价格表】

    今天比较闲所以就花点时间又写了点东西. 相信这种价格表大家不会陌生 现在我就模仿它做一个简单版本的.效果如下 首先需要两个时间控件,我这里用的是HTML5里面的时间控件,这个没限制喜欢用什么就用什么 ...

  6. Sublime Text 3的快捷键

    Sublime Text 3是一个非常了不起的软件,它不仅具有令人难以置信的内置功能(多行编辑和VIM模式),而且还支持插件.代码片段和其它许多东西. 今天,我们来总结一下Sublime Text 3 ...

  7. JavaScript 继承的几种模式

    /** * Created by 2016 on 2016/6/5. */ //1.原型链继承 //把子类的原型,定义为超类的实例 通过原型来访问超类的方法和属性 function Person(){ ...

  8. python基础学习(二)--函数

    return返回值: python函数都有返回值,函数体内无return,默认返回值None, 函数参数: 1.普通参数 严格按照顺序,将实际参数赋值给形式参数,一一对应. 例: def send(x ...

  9. Anagrams问题

    #include<stdio.h> #include<string.h> int main() { int i; ],word2[]; //分别用于存储输入的两个单词 int ...

  10. extern "C"的作用

    一.概述 在C语言的头文件中,经常可以看到如下的代码,那这个是什么作用呢? #ifdef __cplusplus extern "C" { #endif /*...*/ #ifde ...