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




  • 相关阅读:
    理解mipi协议【转】
    Using KernelShark to analyze the real-time scheduler【转】
    内核栈溢出【转】
    检测内核的堆栈溢出【转】
    gcc 编译 + 选项【转】
    service mysqld start 报错:service mysqld start 报错 090517 13:34:15 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 090Can't open the mysql.plugin table. Please run mysql
    【推荐】MySQL Cluster报错及解决方法(不断更新中)
    MySQL Cluster 配置文件(config.ini)详解
    关于MySQL Cluster集群NoOfReplicas参数问题
    通过PHP current()函数获取未知字符键名数组第一个元素的值
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468933.html
Copyright © 2020-2023  润新知