[关闭]
@frank-shaw 2015-10-29T10:55:30.000000Z 字数 1433 阅读 2536

三个线程轮流输出各自名字10次

java.多线程


  1. package test1;
  2. /*
  3. * 该程序功能是实现线程ABC依次输出各自名称N次
  4. *
  5. * 思路:(借鉴网络,自己没有找到解决方案)
  6. * 这里使用三把锁 A B C
  7. * 线程A 的执行依赖与锁A B 相关的内容
  8. * 线程B 的执行依赖与锁B C 相关的内容
  9. * 线程C 的执行依赖与锁C A 相关的内容
  10. *
  11. * 同时设置一计数器,每个线程执行一定次数停止
  12. *
  13. * **************************************************
  14. * 考察了对wait() notify() notifyAll()的理解:
  15. *
  16. * Obj.wait(),与Obj.notify()必须要与synchronized(Obj)
  17. * 一起使用,也就是wait,与notify是针对已经获取了Obj锁进
  18. * 行操作,从语法角度来说就是Obj.wait(),Obj.notify必须在
  19. * synchronized(Obj){...}语句块内。
  20. *
  21. * wait():线程在获取对象锁后,主动释放对象锁,同时本线程休眠。
  22. * 直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对
  23. * 象锁,并继续执行。
  24. *
  25. * notify():释放对象锁,并且唤醒正在等待该对象锁的某一个线程。
  26. * 需要注意的是,执行完notify()之后并不是立即释放对象锁,而是
  27. * 执行完synchronized(Obj){...}语句块之后释放。
  28. *
  29. * notifyAll()与notify()类似,只不过唤醒的是所有正在等待该对
  30. * 象锁的线程,让他们竞争去吧~
  31. *
  32. */
  33. public class ABCInorder {
  34. //三把锁
  35. static Object A = new Object();
  36. static Object B = new Object();
  37. static Object C = new Object();
  38. public static void main(String[] args) {
  39. Thread t1 = new Thread(new Source(A,B,3),"A");
  40. Thread t2 = new Thread(new Source(B,C,4),"B");
  41. Thread t3 = new Thread(new Source(C,A,3),"C");
  42. t1.start();
  43. t2.start();
  44. t3.start();
  45. }
  46. }
  47. class Source implements Runnable{
  48. //lock in the source
  49. Object inside;
  50. Object outside;
  51. //看来我想错了,这里的count并不是共有资源
  52. int count;
  53. public Source(Object in, Object out,int num){
  54. this.inside = in;
  55. this.outside = out;
  56. this.count = num;
  57. }
  58. @Override
  59. public void run() {
  60. while(true){
  61. if(count>0){
  62. synchronized(outside){
  63. synchronized(inside){
  64. count--;
  65. System.out.print(Thread.currentThread().getName());
  66. //释放inside锁,唤醒其他正在等待该锁的线程
  67. inside.notifyAll();
  68. }
  69. try{
  70. //释放outside这个锁,并且等待别人唤醒
  71. outside.wait();
  72. }catch(Exception e){
  73. e.printStackTrace();
  74. }
  75. }
  76. }
  77. else return ;
  78. }
  79. }
  80. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注