JAVA synchronized 线程经典 生产者消费者 两个完全不同的实现的方式

来源:互联网 发布:repo mac 编辑:程序博客网 时间:2024/06/06 19:27
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();    } }




第二种,采用堆栈的方式:
 
	
				
		
原创粉丝点击