• 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 }
  • 相关阅读:
    BZOJ 4802 欧拉函数(Pollard_Rho)
    Codeforces 804E The same permutation(构造)
    Codeforces 804D Expected diameter of a tree(树形DP+期望)
    BZOJ 3399 [Usaco2009 Mar]Sand Castle城堡(贪心)
    BZOJ 2430 [Poi2003]Chocolate(贪心+归并排序)
    BZOJ 1707 [Usaco2007 Nov]tanning分配防晒霜(扫描线+贪心+优先队列)
    BZOJ 1828 [Usaco2010 Mar]balloc 农场分配(贪心+线段树)
    BZOJ 1827 [Usaco2010 Mar]gather 奶牛大集会(树形DP)
    BZOJ 2697 特技飞行(贪心)
    BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)
  • 原文地址:https://www.cnblogs.com/litaiqing/p/4635166.html
Copyright © 2020-2023  润新知