龙须面

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

实现Runnable:

  1、由于Java要求是单继承的,所以可以把这个继承的机会留给其他类, 

  2、适合对共享性资源的访问 

下面通过例子说明:

  卖票系统,有四个窗口同时进行

  1、通过继承Thread类实现:  

V继承Thread类的方式
输出结果  

从结果可以看出,每个窗口卖得票种是不同的,不符合要求,下面我们来实现Runnable的方式来解决这种问题

  2、通过实现Runnable接口

实现Runnbale接口
输出的结果
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的代码快中。下面这个例子中,是木有实现原子性导致的错误:

没有对资源实现原子性的
 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 } 
输出的结果
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

可以看到这种不符合现实的结果,导致这种情况的原因是,线程之间相互干扰,这就涉及到线程的安全性问题,

synchronized保证线程安全执行
 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 } 
输出的结果
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

这才是符合现实的结果!

 

 

posted on 2012-06-27 09:53  木子小黑  阅读(1787)  评论(1编辑  收藏  举报