您的位置:首页 > 移动开发 > Android开发

Android线程—买票demo

2017-05-19 11:06 169 查看
此篇讲述多线程买票小例子



1.实现Runnable接口 实现多线程



public class MyRunnable implements Runnable{

private int ticket=6;//6张票

@Override
public void run() {
  for(int i=0;i<=6;i++){//举例 比总票数大即可

                    if(ticket>0){

                          System.out.println(Thread.currentThread().getName()+ "----正在卖票----票总数"+ticket);


                          ticket--

                    }

               }
  }

}




2.模拟买票窗口

public static void main(String[] args) {

MyRunnable r=new MyRunnable();
Thread r1=new Thread(r, "窗口1");//窗口1 新建状态
Thread r2=new Thread(r,"窗口2");//窗口2 新建状态
Thread r3=new Thread(r,"窗口3");//窗口3 新建状态
r1.start();//窗口1 就绪状态 准备买票
r2.start();//窗口2 就绪状态 准备买票
r3.start();//窗口3 就绪状态 准备买票

}




3.结果

3.1.

窗口3----正在卖票----票总数5

窗口1----正在卖票----票总数6

窗口2----正在卖票----票总数4

窗口1----正在卖票----票总数2

窗口3----正在卖票----票总数3

窗口2----正在卖票----票总数1




3.2.

窗口1----正在卖票----票总数6

窗口1----正在卖票----票总数5

窗口1----正在卖票----票总数4

窗口1----正在卖票----票总数3

窗口1----正在卖票----票总数2

窗口2----正在卖票----票总数1




3.3.

窗口2----正在卖票----票总数6

窗口3----正在卖票----票总数5

窗口1----正在卖票----票总数6

窗口3----正在卖票----票总数3

窗口2----正在卖票----票总数4

窗口3----正在卖票----票总数1

窗口1----正在卖票----票总数2




显然以上结果 只有3.2是正确的结果 错误的原因在于 Runnable 中多线程共享的方法没有同步



改进

@Override

public void run() {
      synchronized (this) {
             for(int i=0;i<=100;i++){//举例 比总票数大即可
                   if(ticket>0){
           
           System.out.println(Thread.currentThread().getName()+ "----正在卖票----票总数"+ticket);

                       ticket--;
                   }
               }
     }

}




即给多线程要操作的代码块进行同步



结果1.

窗口1----正在卖票----票总数6

窗口1----正在卖票----票总数5

窗口1----正在卖票----票总数4

窗口1----正在卖票----票总数3

窗口1----正在卖票----票总数2

窗口1----正在卖票----票总数1




结果2.

窗口2----正在卖票----票总数6

窗口2----正在卖票----票总数5

窗口2----正在卖票----票总数4

窗口2----正在卖票----票总数3

窗口2----正在卖票----票总数2

窗口2----正在卖票----票总数1




结果3.

窗口1----正在卖票----票总数6

窗口1----正在卖票----票总数5

窗口1----正在卖票----票总数4

窗口1----正在卖票----票总数3

窗口1----正在卖票----票总数2

窗口1----正在卖票----票总数1




结果4.

窗口1----正在卖票----票总数6

窗口1----正在卖票----票总数5

窗口1----正在卖票----票总数4

窗口1----正在卖票----票总数3

窗口1----正在卖票----票总数2

窗口1----正在卖票----票总数1




以上结果标示加上同步之后一个线程进入买票代码 其他线程就不可进入了 这样就避免的票数不对的问题。 但是有一个问题及只能某一个线程(窗口)访问。





改进

private int ticket=6;//6张票

@Override
public void run() {

        for(int i=0;i<=100;i++){//举例 比总票数大即可

        sell();

        }

}

public synchronized void sell(){
if(ticket>0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

        System.out.println(Thread.currentThread().getName()+ "----正在卖票----票总数"+ticket);

    ticket--;

        }

}


即将同步放到 run 方法外部

结果

1.

窗口2----正在卖票----票总数6

窗口2----正在卖票----票总数5

窗口3----正在卖票----票总数4

窗口3----正在卖票----票总数3

窗口3----正在卖票----票总数2

窗口1----正在卖票----票总数1


2.

窗口1----正在卖票----票总数6

窗口1----正在卖票----票总数5

窗口1----正在卖票----票总数4

窗口3----正在卖票----票总数3

窗口3----正在卖票----票总数2

窗口3----正在卖票----票总数1


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息