首页 > 代码库 > Android多线程研究(5)——线程之间共享数据

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(); 

       } 

    } 

}