[关闭]
@frank-shaw 2015-10-29T10:54:57.000000Z 字数 1023 阅读 1935

多线程卖票代码

java.多线程


  1. package test1;
  2. /*
  3. * 卖票系统:
  4. *
  5. * 票是共有资源,所以票类就成了资源类
  6. * 票类并不是线程,这一点需要注意,它只是线程的资源
  7. * 或者说仅仅是包含了线程需要运行的资源与代码
  8. * 这样子解释的话就清楚明了一些
  9. *
  10. * 这里为了解决资源共享冲突(线程间通信)问题,使用了重入锁来执行同步操作
  11. * 效果很好。只是当时自己有些傻逼,现在好了。
  12. * 相比于synchronized,据说可重入锁的效率更高一些
  13. *
  14. *
  15. * 关于sleep()方法的一些感想2015.10.27
  16. * (1)在抢占CPU资源的时候,线程执行到sleep()方法的时候回使得当前线程放弃
  17. * CPU资源,进入阻塞状态
  18. * (2)在抢占线程资源(包含锁)的时候,只要在锁内部,即使该部分包含有sleep()
  19. * 方法,此时线程依然会放弃CPU资源,但是不会放弃锁资源,所谓“占着茅坑不拉屎”是也。
  20. */
  21. import java.util.concurrent.locks.*;
  22. public class BuyTicket {
  23. public static void main(String[] args) {
  24. //票资源
  25. Tickets tk = new Tickets(50);
  26. //创建3个线程
  27. new Thread(tk).start();
  28. new Thread(tk).start();
  29. new Thread(tk).start();
  30. }
  31. }
  32. /*
  33. * 该类实现了Runnable,可以实现资源共享
  34. * 而票在这里即为共享资源
  35. */
  36. class Tickets implements Runnable {
  37. int ticketNum;
  38. Lock lock = new ReentrantLock();
  39. public Tickets() {
  40. }
  41. public Tickets(int num){
  42. this.ticketNum = num;
  43. }
  44. @Override
  45. public void run() {
  46. while(true){
  47. lock.lock();
  48. //这里使用try的原因是使用可重入锁的要求
  49. try{
  50. if(ticketNum >0){
  51. //这里使用try的原因是由于sleep()方法的要求
  52. try{
  53. Thread.sleep(100);
  54. }catch(Exception e){
  55. e.printStackTrace();
  56. }
  57. System.out.println("卖票卖票,快来买啦,不然很快就没有啦~ 卖出第" + ticketNum + "张");
  58. ticketNum--;
  59. }
  60. }
  61. finally{
  62. lock.unlock();
  63. }
  64. }
  65. }
  66. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注