转载

多线程范围内的数据共享

多线程范围内的共享解决方法参考有4中:

1.如果线程执行的代码相同,多个线程共享同一个runnable对象时,将共享数据放在runnable对象

2.如果多个线程执行的代码不同,将共享数据封装到一个对象中,将这个对象逐一传递给各个runnable对象

3.如果多个线程执行的代码不同,将共享数据作为外部类的final成员变量,将不同的runnable对象作为内部类主动取数据

4.将数据声明为static的方式()

见如下示例:

1.如果线程执行的代码相同,多个线程共享同一个runnable对象时,将共享数据放在runnable对象

 public class MuiltThreadShare {     /**      * 多个线程共享数据方法:      * 1.如果线程执行的代码相同,多个线程共享同一个runnable对象时,将共享数据放在runnable对象      * 2.如果多个线程执行的代码不同,将共享数据封装到一个对象中,将这个对象逐一传递给各个runnable对象      * 3.如果多个线程执行的代码不同,将共享数据作为外部类的final成员变量,将不同的runnable对象作为内部类主动取数据      */          public static void main(String[] args) {         //1.方式一         Task1 task1 = new Task1();         new Thread(task1).start();         new Thread(task1).start();         new Thread(task1).start();                                }       }  class Task1 implements Runnable{     /**      * 1.如果线程执行的代码相同,多个线程共享同一个runnable对象时,将共享数据放在runnable对象      */          private int i = 100;      @Override     public void run() {         increase();         decrease();     }          private synchronized void increase(){         try {             Thread.sleep(200);//为了更容易看到线程执行现象         } catch (InterruptedException e) {             e.printStackTrace();         }         i++;         System.out.println(Thread.currentThread().getName() +",num:"+i);     }     private synchronized void decrease(){         i--;         System.out.println(Thread.currentThread().getName() +",num:"+i);     } 

运行结果:最终还是100,不同的线程使用共享数据

 运行结果 //    Thread-0,num:101 //    Thread-2,num:102 //    Thread-1,num:103 //    Thread-2,num:102 //    Thread-0,num:101 //    Thread-1,num:100 

2.如果多个线程执行的代码不同,将共享数据封装到一个对象中,将这个对象逐一传递给各个runnable对象

 public class MuiltThreadDataShare2 {     public static void main(String[] args) {         // 2.如果多个线程执行的代码不同,将共享数据封装到一个对象中,将这个对象逐一传递给各个runnable对象         /**          * 模拟银行转账功能,可以指定存取款金额,账号初始额度100          */         ShareData data = new ShareData(0);          // 存50元         new Thread(new TaskIncrease(data, 50)).start();         // 取30元         new Thread(new Taskdecrease(data, 30)).start();         // 存20         new Thread(new TaskIncrease(data, 20)).start();      }  }  class Taskdecrease implements Runnable {     public Taskdecrease(ShareData shareData, int num) {         this.shareData = shareData;         this.num = num;     }      private int num;      private ShareData shareData;      @Override     public void run() {         shareData.decrease(num);     }  }  class TaskIncrease implements Runnable {     public TaskIncrease(ShareData shareData, int num) {         this.shareData = shareData;         this.num = num;     }      private ShareData shareData;     private int num;      @Override     public void run() {         shareData.increase(num);     }  }  class ShareData {     public ShareData(int num) {         i = num;         System.out.println("账户进行初始化,金额为:" + num);     }      private int i;      public synchronized void increase(int i) {         try {             Thread.sleep(200);// 为了更容易看到线程执行现象         } catch (InterruptedException e) {             e.printStackTrace();         }         this.i = this.i + i;         System.out.println(Thread.currentThread().getName() + "账户存入" + i + "元,目前账户余额为:" + this.i);     }      public synchronized void decrease(int i) {         this.i = this.i - i;         System.out.println(Thread.currentThread().getName() + "账户取出" + i + "元,目前账户余额为:" + this.i);     } } 

运行结果:

 账户进行初始化,金额为:0 Thread-0账户存入50元,目前账户余额为:50 Thread-2账户存入20元,目前账户余额为:70 Thread-1账户取出30元,目前账户余额为:40 

3.如果多个线程执行的代码不同,将共享数据作为外部类的final成员变量,将不同的runnable对象作为内部类主动取数据

 public class MuiltThreadDataShare3 {       public static void main(String[] args) {         final Data data = new Data();         new Thread(new Runnable() {             @Override             public void run() {                 data.decrease(10);             }         }).start();         new Thread(new Runnable() {             @Override             public void run() {                 data.increase(30);             }         }).start();      }  }  class Data {     private int money = 100;      public int getMoney() {         return money;     }      public void setMoney(int money) {         this.money = money;     }      public synchronized void increase(int i) {         try {             Thread.sleep(200);// 为了更容易看到线程执行现象         } catch (InterruptedException e) {             e.printStackTrace();         }         this.money = this.money + i;         System.out.println(Thread.currentThread().getName() + "账户存入" + i + "元,目前账户余额为:" + this.money);     }      public synchronized void decrease(int i) {         this.money = this.money - i;         System.out.println(Thread.currentThread().getName() + "账户取出" + i + "元,目前账户余额为:" + this.money);     }  } 

4.将数据声明为static的方式

 public class MuiltThreadDataShare4 {     private static int num = 100;      public static void main(String[] args) {         new Thread(new Runnable() {             @Override             public void run() {                 increase(100);             }         }).start();         new Thread(new Runnable() {             @Override             public void run() {                 decrease(30);             }         }).start();     }      public static synchronized void increase(int i) {         try {             Thread.sleep(200);// 为了更容易看到线程执行现象         } catch (InterruptedException e) {             e.printStackTrace();         }         num = num + i;         System.out.println(Thread.currentThread().getName() + "账户存入" + i + "元,目前账户余额为:" + num);     }      public static synchronized void decrease(int i) {         num = num - i;         System.out.println(Thread.currentThread().getName() + "账户取出" + i + "元,目前账户余额为:" + num);     }  } 

正文到此结束
Loading...