7.多个线程之间共享数据的方式探讨-JDK5多线程

 1 /**
 2  * 多个线程之间共享数据的方式探讨
 3  * @author LiTaiQing
 4  * 
 5  * *************************************************
 6  * 如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,有
 7  * 如下两种方式来实现这些Runnble对象之间的数据共享:
 8  *         1.将共享数据封装在另外一个对象中,然后将这个对象逐一传递给
 9  * 各个Runnble对象。每个线程对共享数据的操作方法也分配到那个对象身
10  * 上去完成,这样容易实现针对该数据进行的各个操作的互斥和通信。
11  *         2.将这些Runnable对象作为某一个类中的内部类,共享数据作为
12  * 这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,
13  * 以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnble
14  * 对象调用外部类的这些方法。
15  *         上面两种方式的组合:将共享数据封装在另一个对象中,每个线程对
16  * 共享数据的操作方法也分配到那个对象身上去完成,对象作为这个外部类中的
17  * 成员变量或方法中的局部变量,每个线程的Runnable对象作为外部类中的
18  * 成员内部类或局部内部类。
19  *         总之,要同步互斥的极短代码最好是分别放在几个独立的方法中,这些
20  * 方法再放在同一个类中,这样比较容易实现它们之间的同步互斥和通信。
21  * *************************************************
22  *
23  */
24 public class MultiThreadShareData {
25     
26     private static ShareData1 data1 = new ShareData1();
27     
28     public static void main(String[] args) {
29         
30         final ShareData1 data2 = new ShareData1();
31         new Thread(new MyRunnable1(data1)).start();
32         new Thread(new MyRunnable1(data2)).start();
33         
34         final ShareData1 data1 = new ShareData1();
35         new Thread(new Runnable(){
36             @Override
37             public void run() {
38                 data1.decrement();
39             }
40         }).start();
41         new Thread(new Runnable(){
42             @Override
43             public void run() {
44                 data1.increment();
45             }
46         }).start();
47     }
48     
49     
50 }
51 
52 class MyRunnable1 implements Runnable{
53     
54     private ShareData1 data1;
55 
56     public MyRunnable1(ShareData1 data1){
57         this.data1 = data1;
58     }
59     
60     @Override
61     public void run() {
62         data1.decrement();
63     }
64 }
65 
66 class MyRunnable2 implements Runnable{
67     
68     private ShareData1 data1;
69 
70     public MyRunnable2(ShareData1 data1){
71         this.data1 = data1;
72     }
73     
74     @Override
75     public void run() {
76         data1.increment();
77     }
78 }
79 
80 class ShareData1 /*implements Runnable*/{
81     
82     private int count = 100;
83     
84     private int j = 0;
85     public synchronized void increment(){
86         j++;
87     }
88     public synchronized void decrement(){
89         j--;
90     }
91 //    @Override
92 //    public void run() {
93 //        while(true){
94 //            count--;
95 //        }
96 //    }
97     
98 }
原文地址:https://www.cnblogs.com/litaiqing/p/4635166.html