zoukankan      html  css  js  c++  java
  • JAVA synchronized 线程经典 生产者消费者 两个完全不同的实现的方式

    package sell_ticket;
    
    public class ThreadTicket {
    
          public static void main(String[] args) {   
                MyThread m = new MyThread();        
                Thread t1 = new Thread(m);
                Thread t2 = new Thread(m);
                Thread t3 = new Thread(m);
                t1.start();
                t2.start();
                t3.start();
            }        
    }
    
    class MyThread implements Runnable{
        private int ticket=100;
        
        
    //synchronized
        public void run(){
            while(true){     
                  try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                    e.printStackTrace();
                  }
                //用synchronized包起来,形成同步代码块,但后来发现用不用其实一样
                synchronized(this){
                    if(ticket>0){
                        System.out.println(Thread.currentThread().getName()+"出售了"+ticket);            
                        ticket--;
                    }
                }
                
            }
        }
        
        
    }
    
    以上还有另一个写法,synchronized一个方法:
    
    class Test implements Runnable
    {
        //票的总数
        private int ticket=20;
        public void run()
        {
           //50只是用来循环,无意义
          for(int i=1;i<50;i++)
            {
                try {
                    //休眠1s秒中,为了使效果更明显,否则可能出不了效果
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                this.sale();
            }
        }
        public synchronized void sale()
        {
                if(ticket>0)
                {
                   //很有意思的一个发现,如果用System.out.println(Thread.currentThread().getName()+"号窗口卖出"+this.ticket--+"号票"); 哪怕不用synchronized,重复卖票的现像也会低很多
                  
                    System.out.println(Thread.currentThread().getName()+"号窗口卖出"+this.ticket+"号票");
                    ticket--;
                }
        }
        
        public static void main(String args[])
        {
            Test mt=new Test();
            //基于火车票创建三个窗口
            new Thread(mt,"a").start();
            new Thread(mt,"b").start();
            new Thread(mt,"c").start();
        } 
    }




    第二种,采用堆栈的方式:
     
    
    
    
    
    
    
    
    
    
    
    
       
    
  • 相关阅读:
    未来行业
    百度网盘搜索方法
    JavaScript继承详解
    Win 7下破解Loadrunner 11(带中文版下载地址)
    NET下RabbitMQ实践[WCF发布篇]
    NET下RabbitMQ实践[示例篇]
    NET下RabbitMQ实践[配置篇]
    8个超炫的 Web 效果
    Windows下安装zip包解压版mysql
    键盘上相当于鼠标右键的快捷键和电脑快捷键大全
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314507.html
Copyright © 2011-2022 走看看