java多线程下模拟抢票
我们设置三个对象分别同时抢20张票,利用多线程实现.
1 public class Web123506 implements Runnable{ 2 private int ticteksNums=20;//票数 3 4 @Override 5 public void run() { 6 while (true){ 7 if(ticteksNums<0){ 8 break; 9 } 10 /* try { 11 //睡眠 12 Thread.sleep(200); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 }*/ 16 System.out.println(Thread.currentThread().getName()+"-->抢到了"+ticteksNums--); 17 18 } 19 } 20 21 public static void main(String[] args) { 22 // 一份资源 23 Web123506 web = new Web123506(); 24 //多个代理 25 new Thread(web,"我们").start(); 26 new Thread(web,"你们").start(); 27 new Thread(web,"黄牛党").start(); 28 29 } 30 31 }
运行结果为:
我们-->抢到了20
黄牛党-->抢到了18
你们-->抢到了19
黄牛党-->抢到了16
我们-->抢到了17
黄牛党-->抢到了14
你们-->抢到了15
黄牛党-->抢到了12
我们-->抢到了13
黄牛党-->抢到了10
你们-->抢到了11
黄牛党-->抢到了8
我们-->抢到了9
黄牛党-->抢到了6
你们-->抢到了7
黄牛党-->抢到了4
我们-->抢到了5
黄牛党-->抢到了2
你们-->抢到了3
黄牛党-->抢到了0
我们-->抢到了1
结论:
我们可以看到抢到的票没有重复的,说明线程是安全的.
这时候我们加入线程的睡眠.观察线程此时是不是安全的?
1 public class Web123506 implements Runnable{ 2 private int ticteksNums=20;//票数 3 4 @Override 5 public void run() { 6 while (true){ 7 if(ticteksNums<0){ 8 break; 9 } 10 try { 11 //睡眠 12 Thread.sleep(200); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } 16 System.out.println(Thread.currentThread().getName()+"-->抢到了"+ticteksNums--); 17 18 } 19 } 20 21 public static void main(String[] args) { 22 // 一份资源 23 Web123506 web = new Web123506(); 24 //多个代理 25 new Thread(web,"我们").start(); 26 new Thread(web,"你们").start(); 27 new Thread(web,"黄牛党").start(); 28 29 } 30 31 }
运行结果:
黄牛党-->抢到了20
我们-->抢到了19
你们-->抢到了18
黄牛党-->抢到了17
我们-->抢到了16
你们-->抢到了15
黄牛党-->抢到了14
我们-->抢到了13
你们-->抢到了12
你们-->抢到了11
我们-->抢到了10
黄牛党-->抢到了9
你们-->抢到了8
我们-->抢到了7
黄牛党-->抢到了6
你们-->抢到了5
我们-->抢到了4
黄牛党-->抢到了3
你们-->抢到了2
我们-->抢到了1
黄牛党-->抢到了0
你们-->抢到了-1
我们-->抢到了-1
结论:
当我们加入线程的睡眠,此时抢到的票可能出现了负数或者会出现两个人抢到了同一张票此时说明加入线程睡眠线程是不安全的.