Android多线程研究(5)——线程之间共享数据

来源:互联网 发布:手机钢琴软件 编辑:程序博客网 时间:2024/05/22 17:04

一、如果是每个线程都执行相同的代码,则可以使用同一个Runnable来实现共享

public class MultiThreadShareData {public static void main(String[] args) {new Thread(new ShareData()).start();new Thread(new ShareData()).start();}static class ShareData implements Runnable{private int j = 100;@Overridepublic synchronized void run() {j--;}}}
上面代码中两个线程共享数据实现对j变量的递减操作,至于上面代码中为什么要使用一个静态内部类,该类static的作用是不依赖外部类的实例创建对象。

二、如果每个线程执行的代码不同,则需要使用不同的Runnable对象来实现共享

public class MultiThreadShareData {public static void main(String[] args) {final ShareData data1 = new ShareData();//启动第一个线程new Thread(new Runnable() {@Overridepublic void run() {data1.increment(); //加}}).start();//启动第二个线程new Thread(new Runnable() {@Overridepublic void run() {data1.decrement();  //减}}).start();}static class ShareData{private int j = 0;public synchronized void increment(){j++;}public synchronized void decrement(){j--;}}}

将上面代码进修改(将数据作为外部类的成员变量,让Runnable接口操作该成员变量)如下:

public class MultiThreadShareData {public static void main(String[] args) {ShareData data1 = new ShareData();new Thread(new MyRunnable1(data1)).start();new Thread(new MyRunnable2(data1)).start();}static class MyRunnable1 implements Runnable{private ShareData data1;public MyRunnable1(ShareData data1){this.data1 = data1;}@Overridepublic void run() {data1.increment();}}static class MyRunnable2 implements Runnable{private ShareData data1;public MyRunnable2(ShareData data2){this.data1 = data1;}@Overridepublic void run() {data1.decrement();}}static class ShareData{private int j = 0;public synchronized void increment(){j++;}public synchronized void decrement(){j--;}}}

三、一道面试题(设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1)

/**   * 设计 4 个 ( 可以是 n 个 ) 线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1   */   package com.jiaocaigen.test;   public class Test {       // 采用 Runnable 接口方式创建的多条线程可以共享实例属性     private int i ;       // 同步增加方法     private synchronized void inc(){        i ++;        System. out .println(Thread.currentThread().getName()+ "--inc--" + i );    }       // 同步减算方法     private synchronized void dec(){        i --;        System. out .println(Thread.currentThread().getName()+ "--dec--" + i );    }  // 增加线程     class Inc implements Runnable {       public void run() {            inc();        }     }       // 减算线程     class Dec implements Runnable{       public void run() {            dec();        }     }       public static void main(String[] args) {          Test t = new Test();                // 内部类的实例化        Inc inc = t. new Inc();        Dec dec = t. new Dec();               // 创建 2*n 个线程 此处 n=2        for ( int i = 0; i < 2; i++) {           new Thread(inc).start();            new Thread(dec).start();        }     } } 




8 1
原创粉丝点击