zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    将vue文件script代码抽取到单独的js文件
    git pull 提示错误:Your local changes to the following files would be overwritten by merge
    vue和uniapp 配置项目基础路径
    XAMPP Access forbidden! Access to the requested directory is only available from the local network.
    postman与newman集成
    postman生成代码段
    Curl命令
    POST方法的Content-type类型
    Selenium Grid 并行的Web测试
    pytorch转ONNX以及TnesorRT的坑
  • 原文地址:https://www.cnblogs.com/litaiqing/p/4635166.html
Copyright © 2011-2022 走看看