zoukankan      html  css  js  c++  java
  • Document

    这次的的问题引入的比较深入,如果看了这篇博客,不看下一篇,你会很懵逼。

    代码:

     1 package com.day13.math;
     2 /** 
     3 * 类说明 :模拟三个窗口同时售票
     4 * @author 作者 : chenyanlong 
     5 * @version 创建时间:2017年10月29日 
     6 */
     7 public class ThreadTest1 {
     8 
     9     public static void main(String[] args) {
    10         //创建三个线程对象
    11         SaleTicket saleTicket1=new SaleTicket("窗口1");
    12         SaleTicket saleTicket2=new SaleTicket("窗口2");
    13         SaleTicket saleTicket3=new SaleTicket("窗口3");
    14         
    15         //开始售票
    16         saleTicket1.start();
    17         saleTicket2.start();
    18         saleTicket3.start();
    19     }
    20 }
    21 
    22 //售票的窗口
    23 class SaleTicket extends Thread{
    24     
    25     int num=50;//票数
    26     
    27     public SaleTicket(String name){
    28         super(name);
    29     }
    30     
    31 
    32 
    33     @Override
    34     public void run(){
    35         while(true){
    36             if(num>0){
    37                 System.out.println(Thread.currentThread().getName()+"出售了第"+num+"票");
    38                 num--;
    39             }else{
    40                 System.out.println("票买完了!");
    41                 break;
    42             }
    43         }
    44     }
    45 }
    View Code

    运行效果:

     出现在的原因:

    解决办法:修改这行代码就OK了

    1 static int num=50;//票数
    View Code

    再次的运行效果:

    再一次分析下,突然不想写了,哎,写完吧

    解决办法:

     算了,直接复制源码了

     1 package com.day13.math;
     2 /** 
     3 * 类说明 :模拟三个窗口同时售票
     4 * @author 作者 : chenyanlong 
     5 * @version 创建时间:2017年10月29日 
     6 */
     7 public class ThreadTest1 {
     8 
     9     public static void main(String[] args) {
    10         //创建三个线程对象
    11         SaleTicket saleTicket1=new SaleTicket("窗口1");
    12         SaleTicket saleTicket2=new SaleTicket("窗口2");
    13         SaleTicket saleTicket3=new SaleTicket("窗口3");
    14         
    15         //开始售票
    16         saleTicket1.start();
    17         saleTicket2.start();
    18         saleTicket3.start();
    19     }
    20 }
    21 
    22 //售票的窗口
    23 class SaleTicket extends Thread{
    24     
    25     static int num=50;//票数
    26     static Object o=new Object();
    27     public SaleTicket(String name){
    28         super(name);
    29     }
    30     
    31 
    32     @Override
    33     public void run(){
    34         while(true){
    35             //同步代码块:
    36             synchronized (o) {
    37                 if(num>0){
    38                     System.out.println(Thread.currentThread().getName()+"出售了第"+num+"票");
    39                     num--;
    40                 }else{
    41                     System.out.println("票买完了!");
    42                     break;
    43                 }
    44             }
    45         }
    46     }
    47 }
    View Code

    同步代码块原理:

    运行效果:

     

    再次优化下代码:

     1 package com.day13.math;
     2 /** 
     3 * 类说明 :模拟三个窗口同时售票
     4 * @author 作者 : chenyanlong 
     5 * @version 创建时间:2017年10月29日 
     6 */
     7 public class ThreadTest1 {
     8 
     9     public static void main(String[] args) {
    10         //创建三个线程对象
    11         SaleTicket saleTicket1=new SaleTicket("窗口1");
    12         SaleTicket saleTicket2=new SaleTicket("窗口2");
    13         SaleTicket saleTicket3=new SaleTicket("窗口3");
    14         
    15         //开始售票
    16         saleTicket1.start();
    17         saleTicket2.start();
    18         saleTicket3.start();
    19     }
    20 }
    21 
    22 //售票的窗口
    23 class SaleTicket extends Thread{
    24     
    25     static int num=50;//票数
    26     static Object o=new Object();
    27     public SaleTicket(String name){
    28         super(name);
    29     }
    30     
    31 
    32     @Override
    33     public void run(){
    34         while(true){
    35             //同步代码块:
    36             synchronized (o) {
    37                 if(num>0){
    38                     System.out.println(Thread.currentThread().getName()+"出售了第"+num+"票");
    39                     num--;
    40                     try {
    41                         Thread.sleep(100);//每个线程执行一次,就睡眠100毫秒
    42                     } catch (InterruptedException e) {
    43                         // TODO Auto-generated catch block
    44                         e.printStackTrace();
    45                     }
    46                 }else{
    47                     System.out.println("票买完了!");
    48                     break;
    49                 }
    50             }
    51         }
    52     }
    53 }
    View Code

    运行效果:

  • 相关阅读:
    gdb调试的基本使用
    重构改善代码--代码的坏味道
    17级单片机期中测试题目
    左右固定,中间自适应的三栏式布局五种写法
    存一些可能会用得到的vue的UI框架
    vue父子组件传值
    [Vue warn]: Missing required prop: "title"
    js中的值类型和引用类型的区别
    vue+node+mongoDB 火车票H5(四)---完成静态页面
    vue+node+mongoDB 火车票H5(三)---git提交时忽略不想提交的文件
  • 原文地址:https://www.cnblogs.com/chenyanlong/p/7750318.html
Copyright © 2011-2022 走看看