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)——线程之间共享数据的更多相关文章
- JAVA多线程提高四:多个线程之间共享数据的方式
多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...
- JAVA多线程学习八-多个线程之间共享数据的方式
多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...
- JAVA 并发编程-多个线程之间共享数据
原文地址:http://blog.csdn.net/hejingyuan6/article/details/47053409# 多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个R ...
- JAVA 并发编程-多个线程之间共享数据(六)
多线程共享数据的方式: 1.假设每一个线程运行的代码同样.能够使用同一个Runnable对象,这个Runnable对象中有那个共享数据,比如,卖票系统就能够这么做. 2,假设每一个线程运行的代码不同. ...
- 【转】JAVA 并发编程-多个线程之间共享数据
原文地址:http://blog.csdn.net/hejingyuan6/article/details/47053409# 多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个R ...
- day33 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁
今日内容: 1.线程理论 2.锁: 牺牲了效率,保证了数据的安全(重点) 3.守护线程 4.GIL锁:(重点) 5.计算密集型和IO密集型 6.信号量,事件(了解) 7.补充. 子进程中不能input ...
- Android多线程研究(6)——多线程之间数据隔离
在上一篇<Android多线程研究(5)--线程之间共享数据>中对线程之间的数据共享进行了学习和研究,这一篇我们来看看怎样解决多个线程之间的数据隔离问题,什么是数据隔离呢?比方说我们如今开 ...
- Java并发基础09. 多个线程间共享数据问题
先看一个多线程间共享数据的问题: 设计四个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显涉及到了线程间通数据的共享,四个线程共享一个 data,共同操作 ...
- Disruptor 线程间共享数据无需竞争
队列的作用是缓冲 缓冲到 队列的空间里.. 线程间共享数据无需竞争 原文 地址 作者 Trisha 译者:李同杰 LMAX Disruptor 是一个开源的并发框架,并获得2011 Duke’ ...
随机推荐
- menu-代码添加以及add方法参数意义
今天需要给一个menu动态添加一个item,先把方法记录如下 @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(Me ...
- Menu-actionBarMenu字体颜色修改
经常会遇到对menu字体颜色进行修改的情况,今天就遇到了一个.就是在action上有一个menu是黑色的,想要改成白色.方法如下 <style name="Email.Theme&qu ...
- c#的中英文混合字符串截取指定长度,startidx从0开始
//c#的中英文混合字符串截取指定长度,startidx从0开始 by gisoracle@126.com public string getStrLenB(string str, int start ...
- amazeui学习笔记一(开始使用2)--布局示例layouts
amazeui学习笔记一(开始使用2)--布局示例layouts 一.总结 1.样例分析(不要忘记,优先分析这个布局示例):有教你页面怎么布局的,实例中可以分析一波 2.响应式:对应meta标签中的v ...
- 学习笔记(四):jQuery之动画效果
1.show()显示效果 语法:show(speed,callback) Number/String,Function speend为动画执行时间,单位为毫秒.也可以为slow"," ...
- Flask项目之手机端租房网站的实战开发(七)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- 洛谷——P1096 Hanoi双塔问题
https://www.luogu.org/problem/show?pid=1096 题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个 ...
- 解决Keystore was tampered with, or password was incorrect
使用签名文件keystore查看生成的数字签名中报错解决 Keystore was tampered with, or password was incorrect 这是由于android规定自己定义 ...
- vue中监听路由参数变化
今天遇到一个这样的业务场景:在同一个路由下,只改变路由后面的参数值, 比如在这个页面 /aaa?id=1 ,在这个页面中点击一个按钮后 跳转到 /aaa?id=2 , 但从“/aaa?id=1”到“ ...
- JS学习笔记 - fgm练习 - 鼠标移入/移出div样式改变
思路: div的默认样式正常设置. 鼠标移入时,发生改变的样式有3个,即 边框颜色,div背景色,字体颜色. 把这三个css改变设置在一个类名下,再通过js给div动态 添加/去除这个类名,实现div ...