当前位置: 代码迷 >> Android >> Android多线程研究(五)——线程之间共享数据
  详细解决方案

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

热度:68   发布时间:2016-04-28 05:21:37.0
Android多线程研究(5)——线程之间共享数据

一、如果是每个线程都执行相同的代码,则可以使用同一个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;		@Override		public 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() {						@Override			public void run() {				data1.increment(); //加			}		}).start();		//启动第二个线程		new Thread(new Runnable() {						@Override			public 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;		}		@Override		public void run() {			data1.increment();		}			}		static class MyRunnable2 implements Runnable{				private ShareData data1;		public MyRunnable2(ShareData data2){			this.data1 = data1;		}		@Override		public 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();        }     } } 




  相关解决方案