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

       } 

    } 

}

Android多线程研究(5)——线程之间共享数据,布布扣,bubuko.com

时间: 2024-10-13 12:07:47

Android多线程研究(5)——线程之间共享数据的相关文章

7.多个线程之间共享数据的方式探讨-JDK5多线程

1 /** 2 * 多个线程之间共享数据的方式探讨 3 * @author LiTaiQing 4 * 5 * ************************************************* 6 * 如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,有 7 * 如下两种方式来实现这些Runnble对象之间的数据共享: 8 * 1.将共享数据封装在另外一个对象中,然后将这个对象逐一传递给 9 * 各个Runnble对象.每个线程对共享数据的操作方法也分配到那个

JAVA 并发编程-多个线程之间共享数据(六)

多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做. 2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计4个线程.其中两个线程每次对j增加1,另外两个线程对j每次减1,银行存取款 有两种方法来解决此类问题: 将共享数据封装成另外一个对象,然后将这个对象逐一传递给各个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象身上完成,这样容易实现针对

线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i): 3 print(i) 4 if __name__ == '__main__': 5 for i in range(10): 6 t = Thread(target=f1,args=(i,)) 7 t.start() 8 print('主线程') 方式二: 1 from threading im

如何在两个线程之间共享数据

总 1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做. 2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计4个线程.其中两个线程每次对j增加1,另外两个线程对j每次减1,银行存取款 每个线程执行的代码相同,可以使用同一个Runnable对象 public class RunnalbleTest2 implements Runnable { private int threadC

多个线程之间共享数据,(探究)一下十一的车票是怎么卖的

十月一到了,大家有没有抢到回家的车票.笔者有事退了回家的卧铺票,今年十一就不回家了.算下来有8个多月没有回家了,混沌之余想想抢票是怎么回事吧.为什么会有许多的抢票软件,还有12306发售的,还有售票窗口发售的.就不会卖重吗?题设来了:现在剩下1000张票了,有的地方在买票.有的还像笔者一样退了票.其实归根结底,我们操作的都是12306的共享数据那1000张票.在这里不得不讲解一下,一个关键的地方: synchronized 关键字,代表这个方法加锁 也就是说当线程运行到这个方法的时候,就开始检查

多个线程之间共享数据

public class ThreadDemo4 { static ShareData data=new ShareData(); public static void main(String[] args) { new Thread(new Myrunnable1(data)).start(); new Thread(new Myrunnable2(data)).start(); } } class Myrunnable1 implements Runnable{ int i=50; priv

Android多线程研究(6)——多线程之间数据隔离

在上一篇<Android多线程研究(5)--线程之间共享数据>中对线程之间的数据共享进行了学习和研究,这一篇我们来看看如何解决多个线程之间的数据隔离问题,什么是数据隔离呢?比如说我们现在开启了两个线程,这两个线程都要同时给同一个全局变量data赋值,各个线程操作它赋值后的变量数据,这里就需要用到隔离.先看一段代码: import java.util.Random; public class ThreadLocalTest { private static int data = 0; publi

多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)

ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量. 1.下图和辅助代码解释ThreadLocal的作用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据. 2.每个线程调用全局ThreadLocal

多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)

多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,有如下两种方式来实现这些Runnable对象之间的数据共享:            将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象.每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个