java多线程实现:Runnable接口

野性酷女 2022-07-18 11:59 450阅读 0赞

实现Runnable接口,可以实现资源共享,网上很多卖票例子是生成多个个线程,但只声明了一个Runnable对象(共享变量票数在Runnable对象里),然后传给多个Thread线程,达到资源共享。
可参考:http://blog.csdn.net/lyt_7cs1dn9/article/details/52486317

本例子是直接在main生成了一个map作为共享变量,然后传给多个Runnable的构造器中,再把多个Runnable对象传入Thread构造器生成多个线程。
直接上例子:

  1. package com.lyt.study.controller;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.Map;
  5. import java.util.Set;
  6. /** * Created by lyt on 2016/9/8 0008. */
  7. class SaleTicketThread implements Runnable{
  8. private String saleWindowName; //售票窗口名称
  9. private Map<String,Boolean> ticketMap; //车票池
  10. //构造方法
  11. this.saleWindowName = saleWindowName;
  12. this.ticketMap = ticketMap;
  13. }
  14. public void run() {
  15. System.out.println(saleWindowName ); //输出线程名称
  16. Set<String> keySet= ticketMap.keySet();
  17. synchronized(ticketMap){ //synchronized同步锁住车票map
  18. for(String s:keySet){
  19. if(!ticketMap.get(s)){
  20. System.out.println(saleWindowName +":" + s + "已被售出。");
  21. ticketMap.put(s,true);
  22. }
  23. }
  24. }
  25. }
  26. }
  27. public class TicketSaleMain {
  28. public static void main(String[] args){
  29. //首先需要定义一个火车票池 key代表第几张票,value代表是否卖出
  30. Map<String,Boolean> ticketMap = new HashMap<String,Boolean>();
  31. for(int i=1;i<=50;i++){
  32. ticketMap.put("第"+i+"张票",false); //起始都没卖出,value为false
  33. }
  34. SaleTicketThread stt1= new SaleTicketThread("窗口1",ticketMap); //把票池map给4个窗口共享
  35. SaleTicketThread stt2= new SaleTicketThread("窗口2",ticketMap); //把票池map给4个窗口共享
  36. SaleTicketThread stt3= new SaleTicketThread("窗口3",ticketMap); //把票池map给4个窗口共享
  37. SaleTicketThread stt4= new SaleTicketThread("窗口4",ticketMap); //把票池map给4个窗口共享
  38. Thread t1=new Thread(stt1);
  39. Thread t2=new Thread(stt2);
  40. Thread t3=new Thread(stt3);
  41. Thread t4=new Thread(stt4);
  42. t1.start(); //启动线程
  43. t2.start(); //启动线程
  44. t3.start(); //启动线程
  45. t4.start(); //启动线程
  46. }
  47. }
  48. 运行结果:
  49. 窗口1
  50. 窗口2
  51. 窗口1:第45张票已被售出。
  52. 窗口1:第32张票已被售出。
  53. 窗口1:第33张票已被售出。
  54. 窗口3
  55. 窗口1:第17张票已被售出。
  56. 窗口1:第26张票已被售出。
  57. 窗口1:第34张票已被售出。
  58. 窗口1:第24张票已被售出。
  59. 窗口4
  60. 窗口1:第44张票已被售出。
  61. 窗口1:第27张票已被售出。
  62. 窗口1:第31张票已被售出。
  63. 窗口1:第36张票已被售出。
  64. 窗口1:第15张票已被售出。
  65. 窗口1:第1张票已被售出。
  66. 窗口1:第2张票已被售出。
  67. 窗口1:第16张票已被售出。
  68. 窗口1:第30张票已被售出。
  69. 窗口1:第25张票已被售出。
  70. 窗口1:第50张票已被售出。
  71. 窗口1:第35张票已被售出。
  72. 窗口1:第14张票已被售出。
  73. 窗口1:第42张票已被售出。
  74. 窗口1:第43张票已被售出。
  75. 窗口1:第12张票已被售出。
  76. 窗口1:第11张票已被售出。
  77. 窗口1:第28张票已被售出。
  78. 窗口1:第48张票已被售出。
  79. 窗口1:第13张票已被售出。
  80. 窗口1:第46张票已被售出。
  81. 窗口1:第47张票已被售出。
  82. 窗口1:第49张票已被售出。
  83. 窗口1:第7张票已被售出。
  84. 窗口1:第29张票已被售出。
  85. 窗口1:第41张票已被售出。
  86. 窗口1:第20张票已被售出。
  87. 窗口1:第40张票已被售出。
  88. 窗口1:第4张票已被售出。
  89. 窗口1:第21张票已被售出。
  90. 窗口1:第37张票已被售出。
  91. 窗口1:第10张票已被售出。
  92. 窗口1:第3张票已被售出。
  93. 窗口1:第38张票已被售出。
  94. 窗口1:第9张票已被售出。
  95. 窗口1:第8张票已被售出。
  96. 窗口1:第18张票已被售出。
  97. 窗口1:第22张票已被售出。
  98. 窗口1:第19张票已被售出。
  99. 窗口1:第6张票已被售出。
  100. 窗口1:第23张票已被售出。
  101. 窗口1:第39张票已被售出。
  102. 窗口1:第5张票已被售出。

由上述结果可以知道,四个线程都执行了,只是最先先执行的线程把map对象锁起来,所有的票都卖光了,其他线程都没有票卖了。
把run方法的synchronized换下位置,如下:

  1. public void run() {
  2. System.out.println(saleWindowName );
  3. Set<String> keySet= ticketMap.keySet();
  4. for(String s:keySet){
  5. synchronized(ticketMap){
  6. if(!ticketMap.get(s)){
  7. System.out.println(saleWindowName +":" + s + "已被售出。");
  8. ticketMap.put(s,true);
  9. }
  10. }
  11. }
  12. }
  13. 执行结果:
  14. 窗口2
  15. 窗口1
  16. 窗口2:第45张票已被售出。
  17. 窗口2:第32张票已被售出。
  18. 窗口2:第33张票已被售出。
  19. 窗口2:第17张票已被售出。
  20. 窗口2:第26张票已被售出。
  21. 窗口2:第34张票已被售出。
  22. 窗口4
  23. 窗口3
  24. 窗口1:第24张票已被售出。
  25. 窗口1:第44张票已被售出。
  26. 窗口1:第27张票已被售出。
  27. 窗口1:第31张票已被售出。
  28. 窗口1:第36张票已被售出。
  29. 窗口1:第15张票已被售出。
  30. 窗口1:第1张票已被售出。
  31. 窗口1:第2张票已被售出。
  32. 窗口1:第16张票已被售出。
  33. 窗口1:第30张票已被售出。
  34. 窗口1:第25张票已被售出。
  35. 窗口1:第50张票已被售出。
  36. 窗口1:第35张票已被售出。
  37. 窗口1:第14张票已被售出。
  38. 窗口1:第42张票已被售出。
  39. 窗口1:第43张票已被售出。
  40. 窗口1:第12张票已被售出。
  41. 窗口1:第11张票已被售出。
  42. 窗口1:第28张票已被售出。
  43. 窗口1:第48张票已被售出。
  44. 窗口1:第13张票已被售出。
  45. 窗口1:第46张票已被售出。
  46. 窗口1:第47张票已被售出。
  47. 窗口1:第49张票已被售出。
  48. 窗口1:第7张票已被售出。
  49. 窗口1:第29张票已被售出。
  50. 窗口1:第41张票已被售出。
  51. 窗口1:第20张票已被售出。
  52. 窗口1:第40张票已被售出。
  53. 窗口1:第4张票已被售出。
  54. 窗口1:第21张票已被售出。
  55. 窗口1:第37张票已被售出。
  56. 窗口1:第10张票已被售出。
  57. 窗口1:第3张票已被售出。
  58. 窗口1:第38张票已被售出。
  59. 窗口1:第9张票已被售出。
  60. 窗口1:第8张票已被售出。
  61. 窗口1:第18张票已被售出。
  62. 窗口1:第22张票已被售出。
  63. 窗口1:第19张票已被售出。
  64. 窗口1:第6张票已被售出。
  65. 窗口1:第23张票已被售出。
  66. 窗口1:第39张票已被售出。
  67. 窗口1:第5张票已被售出。

从这次结果可以看出,窗口1和窗口2都有卖票,实现了多线程。

发表评论

表情:
评论列表 (有 0 条评论,450人围观)

还没有评论,来说两句吧...

相关阅读