读书笔记


多线程方面
1、信号量
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用他可以控制同时访问资 源的线程个数。
   
  1. package com.demo.thread;
  2. import java.util.concurrent.Semaphore;
  3. /**
  4. * 题目描述:有三个线程名字分别是A、B、C,每个线程只能打印自己的名字,在
  5. * 屏幕上顺序打印 ABC,打印10次。不准使用线程的sleep()
  6. *
  7. * @author DAL.feng
  8. */
  9. public class OrderPrintByObj extends Thread {
  10. private Semaphore curr;
  11. private Semaphore next;
  12. public OrderPrintByObj(String name, Semaphore curr, Semaphore next) {
  13. super(name);
  14. this.curr = curr;
  15. this.next = next;
  16. }
  17. public void run() {
  18. // 设置循环总次数
  19. int total = 10;
  20. for(int index=0; index<total; index++) {
  21. try {
  22. /*
  23. * 申请许可
  24. * 这里通过初始化信号量实例时设置信号量允许的线程数,
  25. * 来控制3个线程启动时,A先打印,B、C都处于等待状态
  26. */
  27. curr.acquire();
  28. } catch (InterruptedException e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. }
  32. // 打印当前线程名称,用来标记3个线程是顺序打印的
  33. System.out.println(getName());
  34. // 释放下个目标线程绑定的信号量的许可
  35. next.release();
  36. }
  37. }
  38. public static void main(String[] args) {
  39. /*
  40. * 初始化信号量实例,共初始化3个实例,分别绑定线程a、b、c(这3个线程要访问同一个共享资源,设置信号量才有意义);
  41. * 绑定线程a的信号量,其许可为1,其余均为0,
  42. * 意味着3个线程启动后,只有a线程才能申请到许可,解决a先打印的问题;
  43. * 同时,b、c线程信号量都为0,线程启动后由于申请不到许可,会处于等待状态,
  44. * 只有上一个线程工作之后,主动释放下个线程对应的许可才行;
  45. */
  46. Semaphore sa = new Semaphore(1);
  47. Semaphore sb = new Semaphore(0);
  48. Semaphore sc = new Semaphore(0);
  49. OrderPrintByObj a = new OrderPrintByObj("A", sa, sb);
  50. OrderPrintByObj b = new OrderPrintByObj("B", sb, sc);
  51. OrderPrintByObj c = new OrderPrintByObj("C", sc, sa);
  52. a.start();
  53. b.start();
  54. c.start();
  55. }
  56. }







转载于:https://my.oschina.net/u/1997676/blog/384062

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值