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
- Android多线程研究(5)——线程之间共享数据
- Android多线程研究(6)——多线程之间数据隔离
- 线程之间共享数据
- Android多线程研究(9)——线程锁Lock
- Android多线程研究(9)——线程锁Lock
- Android 应用程序之间数据共享—ContentProvider
- Android 应用程序之间数据共享—ContentResolver
- Android 应用程序之间数据共享—ContentResolver
- Android 应用程序之间数据共享—ContentResolver
- Android 应用程序之间数据共享—ContentResolver
- Android 应用程序之间数据共享—ContentProvider
- Android 应用程序之间数据共享—ContentResolver
- Android 应用程序之间数据共享—ContentProvider
- Android 应用程序之间数据共享—ContentResolver
- Android 应用程序之间数据共享—ContentProvider
- Android 应用程序之间数据共享—ContentResolver
- Android 应用程序之间数据共享—ContentProvider
- Android 应用程序之间数据共享—ContentProvider
- Swift 笔记 (四) —— 集合类型
- Unity自带范例的默认安装路径(AngryBots和Bootcamp Demo)
- 遗传算法--genetic algorithm
- codefroces 110A Nearly Lucky Number(模拟水题)
- QML官方系列教程——First Steps with QML
- Android多线程研究(5)——线程之间共享数据
- 乔纳森-弗莱彻:被遗忘的搜索引擎之父
- codeforce 7D kmp字符串匹配
- Ogre学习的环境搭配的选择
- c2java 动态规划之模糊匹配
- Become a Better Developer: 3 Ways Writing Will Expand Your Mind, Improve Your Code and Grow Your Car
- 黑马程序员_Java的泛型
- MySQL学习笔记之六 向数据表插入行记录
- 金融界网站模拟白银大赛,盈利可以兑换现金