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’ ...
随机推荐
- theme-不同主题资源更改
1.找到了影响桌面小部件的布局文件packages/apps/Mms$ vim res/layout/widget.xml修改里面的背景颜色属性,可以实现预期效果,至于里面的 <LinearLa ...
- android图像处理系列之六--给图片添加边框(下)-图片叠加
前面介绍了一种用透明图片叠加的方式添加花边边框,下面将介绍另外一种图片叠加添加花边边框的方式.前面方法有一个缺点,就是做成PNG图片,图片体积会很大,不是一般的大,比同样的JPG大三倍多,如果项目可以 ...
- 根据点画线java
package com.yang; import java.awt.Color; import java.awt.Graphics; import java.util.ArrayList; impor ...
- CSS笔记 - SVG Polyline 图片绘制动画边框
<style> div{ width: 420px; height: 200px; background: url('./img/timg.jpg') no-repeat; } polyl ...
- 常用处理字符串的SQL函数
汇总函数:Count.Sum.AVG.MAX.min; 数学函数: ABS:绝对值.floor:给出比给定值小的最大整数. round(m,n):m为给定的值,n为小数点后保留的位数. power(m ...
- SQL分页的几种方式
1.使用Row_number() over(order by columnName)函数来作为标示分页(下面的例子都是以last_seen来排序的,要求取顺序为20-30行的数据) SELECT Us ...
- 不重新启动VMWare虚拟机加入虚拟磁盘的方法(上)
近期因为业务须要在不重新启动系统的前提下对系统进行扩容,前提是该系统做过lvm.可是没有足够的物理卷(硬盘),所以引出了改文.本文共分为上下两部分.这是第一部分. 文件夹 加入磁盘 做LVM 加入硬盘 ...
- 【MongoDB】The connection between two tables
In mongoDB, there are two general way to connect with two tables. Manual Connection and use DBRef 1. ...
- elasticsearch cluster 概述
在源码概述中我们分析过,elasticsearch源码从功能上可以分为分布式功能和数据功能,接下来这几篇会就分布式功能展开.这里首先会对cluster作简单概述,然后对cluster所涉及的主要功能详 ...
- VC++ 6.0 BUG BUG BUG BUG BUG
http://blog.163.com/amao831@126/blog/#m=0 我经常在的VC++6.0中 定义某个类的对象时 再用.访问或者->访问时不自动弹出他的成员函数或者成员变量 最 ...