实现Runnable:
1、由于Java要求是单继承的,所以可以把这个继承的机会留给其他类,
2、适合对共享性资源的访问
下面通过例子说明:
卖票系统,有四个窗口同时进行
1、通过继承Thread类实现:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
从结果可以看出,每个窗口卖得票种是不同的,不符合要求,下面我们来实现Runnable的方式来解决这种问题
2、通过实现Runnable接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Thread-0 has tickets 100 Thread-1 has tickets 99 Thread-0 has tickets 98 Thread-0 has tickets 95 Thread-0 has tickets 94 Thread-0 has tickets 93 Thread-0 has tickets 92 Thread-0 has tickets 91 Thread-0 has tickets 90 Thread-0 has tickets 89 Thread-0 has tickets 88 Thread-0 has tickets 87 Thread-0 has tickets 86 Thread-0 has tickets 85 Thread-0 has tickets 84 Thread-0 has tickets 83 Thread-0 has tickets 82 Thread-0 has tickets 81 Thread-0 has tickets 80 Thread-0 has tickets 79 Thread-0 has tickets 78 Thread-3 has tickets 96 Thread-1 has tickets 97 Thread-1 has tickets 74 Thread-1 has tickets 73 Thread-1 has tickets 72 Thread-3 has tickets 75 Thread-1 has tickets 71 Thread-2 has tickets 76 Thread-2 has tickets 68 Thread-2 has tickets 67 Thread-2 has tickets 66 Thread-2 has tickets 65 Thread-2 has tickets 64 Thread-2 has tickets 63 Thread-2 has tickets 62 Thread-2 has tickets 61 Thread-2 has tickets 60 Thread-2 has tickets 59 Thread-2 has tickets 58 Thread-2 has tickets 57 Thread-2 has tickets 56 Thread-2 has tickets 55 Thread-0 has tickets 77 Thread-0 has tickets 53 Thread-0 has tickets 52 Thread-0 has tickets 51 Thread-0 has tickets 50 Thread-0 has tickets 49 Thread-0 has tickets 48 Thread-0 has tickets 47 Thread-0 has tickets 46 Thread-0 has tickets 45 Thread-0 has tickets 44 Thread-0 has tickets 43 Thread-0 has tickets 42 Thread-0 has tickets 41 Thread-0 has tickets 40 Thread-0 has tickets 39 Thread-0 has tickets 38 Thread-0 has tickets 37 Thread-0 has tickets 36 Thread-0 has tickets 35 Thread-0 has tickets 34 Thread-0 has tickets 33 Thread-0 has tickets 32 Thread-0 has tickets 31 Thread-0 has tickets 30 Thread-0 has tickets 29 Thread-0 has tickets 28 Thread-0 has tickets 27 Thread-0 has tickets 26 Thread-0 has tickets 25 Thread-0 has tickets 24 Thread-0 has tickets 23 Thread-0 has tickets 22 Thread-0 has tickets 21 Thread-0 has tickets 20 Thread-0 has tickets 19 Thread-0 has tickets 18 Thread-0 has tickets 17 Thread-0 has tickets 16 Thread-0 has tickets 15 Thread-0 has tickets 14 Thread-0 has tickets 13 Thread-0 has tickets 12 Thread-0 has tickets 11 Thread-0 has tickets 10 Thread-0 has tickets 9 Thread-0 has tickets 8 Thread-0 has tickets 7 Thread-0 has tickets 6 Thread-0 has tickets 5 Thread-0 has tickets 4 Thread-0 has tickets 3 Thread-0 has tickets 2 Thread-0 has tickets 1 Thread-2 has tickets 54 Thread-1 has tickets 69 Thread-3 has tickets 70
可以看到,实现接口的方式基本满足要求,但是在实际项目过程中,对资源型的对象(火车票)的操作要排队,而且在整个操作过程中必须保持原子性!解决的办法
是把对资源性文件的操作放在synchronized的代码快中。下面这个例子中,是木有实现原子性导致的错误:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class SellTickets { 2 public static void main(String[] args) { 3 /* 4 new SellTicketsWindows().start(); 5 new SellTicketsWindows().start(); 6 new SellTicketsWindows().start(); 7 new SellTicketsWindows().start(); 8 */ 9 //从视频上看到的结果,这种办法可以达到四个窗口卖同一张票,为什么这里就不可以呢 10 SellTicketsWindows tt = new SellTicketsWindows(); 11 new Thread(tt).start(); 12 new Thread(tt).start(); 13 new Thread(tt).start(); 14 new Thread(tt).start(); 15 } 16 } 17 18 class SellTicketsWindows implements Runnable {//extends Thread { 19 int i = 100; 20 String str = new String(""); 21 @Override 22 public void run() { 23 // TODO Auto-generated method stub 24 25 while(true) { 26 //synchronized(str) { 27 if (i > 0) { 28 try{Thread.sleep(10);} catch(Exception e) {}//模拟进程调度程序强制未完成任务的线程进入就绪状态 29 System.out.println(Thread.currentThread().getName() 30 + " has tickets " + i--); 31 }else { 32 return ; 33 } 34 //} 35 } 36 } 37 38 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Thread-1 has tickets 100 Thread-0 has tickets 100 Thread-2 has tickets 99 Thread-3 has tickets 98 Thread-0 has tickets 97 Thread-2 has tickets 96 Thread-3 has tickets 95 Thread-1 has tickets 94 Thread-0 has tickets 93 Thread-1 has tickets 92 Thread-3 has tickets 91 Thread-2 has tickets 90 Thread-0 has tickets 89 Thread-1 has tickets 88 Thread-3 has tickets 87 Thread-2 has tickets 86 Thread-0 has tickets 85 Thread-3 has tickets 84 Thread-1 has tickets 83 Thread-2 has tickets 82 Thread-0 has tickets 81 Thread-2 has tickets 80 Thread-1 has tickets 79 Thread-3 has tickets 78 Thread-0 has tickets 77 Thread-2 has tickets 76 Thread-1 has tickets 75 Thread-3 has tickets 74 Thread-0 has tickets 73 Thread-1 has tickets 72 Thread-3 has tickets 71 Thread-2 has tickets 72 Thread-0 has tickets 70 Thread-3 has tickets 69 Thread-2 has tickets 68 Thread-1 has tickets 67 Thread-0 has tickets 66 Thread-2 has tickets 65 Thread-3 has tickets 65 Thread-1 has tickets 64 Thread-0 has tickets 63 Thread-2 has tickets 62 Thread-3 has tickets 62 Thread-1 has tickets 61 Thread-0 has tickets 60 Thread-3 has tickets 59 Thread-1 has tickets 58 Thread-2 has tickets 57 Thread-0 has tickets 56 Thread-3 has tickets 55 Thread-1 has tickets 54 Thread-2 has tickets 53 Thread-0 has tickets 52 Thread-3 has tickets 51 Thread-1 has tickets 50 Thread-2 has tickets 49 Thread-0 has tickets 48 Thread-3 has tickets 47 Thread-1 has tickets 46 Thread-0 has tickets 45 Thread-2 has tickets 44 Thread-3 has tickets 43 Thread-1 has tickets 42 Thread-0 has tickets 41 Thread-2 has tickets 40 Thread-3 has tickets 39 Thread-1 has tickets 38 Thread-0 has tickets 37 Thread-2 has tickets 36 Thread-3 has tickets 35 Thread-1 has tickets 34 Thread-2 has tickets 33 Thread-0 has tickets 32 Thread-1 has tickets 31 Thread-3 has tickets 30 Thread-2 has tickets 29 Thread-0 has tickets 28 Thread-3 has tickets 27 Thread-1 has tickets 26 Thread-2 has tickets 25 Thread-0 has tickets 24 Thread-3 has tickets 23 Thread-1 has tickets 22 Thread-2 has tickets 21 Thread-0 has tickets 20 Thread-1 has tickets 19 Thread-3 has tickets 18 Thread-2 has tickets 17 Thread-0 has tickets 16 Thread-3 has tickets 15 Thread-1 has tickets 14 Thread-2 has tickets 13 Thread-0 has tickets 12 Thread-3 has tickets 11 Thread-1 has tickets 11 Thread-2 has tickets 10 Thread-0 has tickets 9 Thread-3 has tickets 8 Thread-1 has tickets 7 Thread-2 has tickets 6 Thread-0 has tickets 5 Thread-1 has tickets 4 Thread-3 has tickets 3 Thread-2 has tickets 2 Thread-0 has tickets 1 Thread-3 has tickets 0 Thread-1 has tickets -1 Thread-2 has tickets -2
可以看到这种不符合现实的结果,导致这种情况的原因是,线程之间相互干扰,这就涉及到线程的安全性问题,
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class SellTickets { 2 public static void main(String[] args) { 3 /* 4 new SellTicketsWindows().start(); 5 new SellTicketsWindows().start(); 6 new SellTicketsWindows().start(); 7 new SellTicketsWindows().start(); 8 */ 9 10 SellTicketsWindows tt = new SellTicketsWindows(); 11 new Thread(tt).start(); 12 new Thread(tt).start(); 13 new Thread(tt).start(); 14 new Thread(tt).start(); 15 } 16 } 17 18 class SellTicketsWindows implements Runnable {//extends Thread { 19 int i = 100; 20 String str = new String(""); 21 @Override 22 public void run() { 23 // TODO Auto-generated method stub 24 25 while(true) { 26 synchronized(str) { 27 if (i > 0) { 28 try{Thread.sleep(10);} catch(Exception e) {}//模拟进程调度程序强制未完成任务的线程进入就绪状态 29 System.out.println(Thread.currentThread().getName() 30 + " has tickets " + i--); 31 }else { 32 return ; 33 } 34 } 35 } 36 } 37 38 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Thread-0 has tickets 100 Thread-0 has tickets 99 Thread-0 has tickets 98 Thread-3 has tickets 97 Thread-3 has tickets 96 Thread-3 has tickets 95 Thread-1 has tickets 94 Thread-1 has tickets 93 Thread-1 has tickets 92 Thread-1 has tickets 91 Thread-1 has tickets 90 Thread-2 has tickets 89 Thread-2 has tickets 88 Thread-2 has tickets 87 Thread-2 has tickets 86 Thread-2 has tickets 85 Thread-2 has tickets 84 Thread-1 has tickets 83 Thread-1 has tickets 82 Thread-1 has tickets 81 Thread-1 has tickets 80 Thread-1 has tickets 79 Thread-1 has tickets 78 Thread-1 has tickets 77 Thread-3 has tickets 76 Thread-3 has tickets 75 Thread-3 has tickets 74 Thread-3 has tickets 73 Thread-0 has tickets 72 Thread-0 has tickets 71 Thread-0 has tickets 70 Thread-0 has tickets 69 Thread-0 has tickets 68 Thread-0 has tickets 67 Thread-0 has tickets 66 Thread-3 has tickets 65 Thread-3 has tickets 64 Thread-3 has tickets 63 Thread-3 has tickets 62 Thread-3 has tickets 61 Thread-1 has tickets 60 Thread-1 has tickets 59 Thread-1 has tickets 58 Thread-1 has tickets 57 Thread-1 has tickets 56 Thread-1 has tickets 55 Thread-2 has tickets 54 Thread-2 has tickets 53 Thread-2 has tickets 52 Thread-1 has tickets 51 Thread-1 has tickets 50 Thread-1 has tickets 49 Thread-1 has tickets 48 Thread-1 has tickets 47 Thread-3 has tickets 46 Thread-0 has tickets 45 Thread-0 has tickets 44 Thread-3 has tickets 43 Thread-3 has tickets 42 Thread-3 has tickets 41 Thread-3 has tickets 40 Thread-1 has tickets 39 Thread-1 has tickets 38 Thread-2 has tickets 37 Thread-2 has tickets 36 Thread-2 has tickets 35 Thread-2 has tickets 34 Thread-1 has tickets 33 Thread-1 has tickets 32 Thread-3 has tickets 31 Thread-3 has tickets 30 Thread-3 has tickets 29 Thread-3 has tickets 28 Thread-3 has tickets 27 Thread-0 has tickets 26 Thread-3 has tickets 25 Thread-3 has tickets 24 Thread-3 has tickets 23 Thread-3 has tickets 22 Thread-1 has tickets 21 Thread-1 has tickets 20 Thread-2 has tickets 19 Thread-2 has tickets 18 Thread-2 has tickets 17 Thread-2 has tickets 16 Thread-2 has tickets 15 Thread-1 has tickets 14 Thread-1 has tickets 13 Thread-1 has tickets 12 Thread-3 has tickets 11 Thread-3 has tickets 10 Thread-3 has tickets 9 Thread-0 has tickets 8 Thread-0 has tickets 7 Thread-0 has tickets 6 Thread-3 has tickets 5 Thread-3 has tickets 4 Thread-3 has tickets 3 Thread-1 has tickets 2 Thread-2 has tickets 1
这才是符合现实的结果!