多线程之间共享数据的实现

1:
如果每个线程执行的代码相同,可以使用同一个Runnable对象,然后将共享的数据放在Runnable里面,来实现数据的共享。 例如买票系统...

package com.cn.gbx;import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;public class TestThread {public static void main(String[] args) {//共享数据放在了Count里面Count count = new Count();new Thread(count).start();new Thread(count).start();}
}class Count implements Runnable{private int count = 10;//加互斥锁,来时实现同步private synchronized void decrement() {count--;System.out.println(Thread.currentThread().getName() + " : " + count);}@Overridepublic void run() {while (true) {decrement();}}
}

  

2: 如果每个线程执行的代码不同, 那么就需要不同的Runnable对象,有两种方式事项这些Runnbale对象之间的数据共享
  a: 将共享数据封装在另一个对象中,然后实现不同的操作,然后将这个新对象传递给Runnable对象,每个线程对共享数据的操作也就相应的分配到了那个对象身上去完成。这样就能够实现对该数据的各种操作的互斥与通信

package com.cn.gbx;import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;public class TestThread {public static void main(String[] args) {ShareData count = new ShareData();new Thread(new CountDec(count)).start();new Thread(new CountInc(count)).start();}
}//将共享数据封装在另一个对象里面
class ShareData {private int count = 100;public synchronized void decrement() {count--;System.out.println(Thread.currentThread().getName() + " :" + count);}public synchronized void increment() {count++;System.out.println(Thread.currentThread().getName() + " :" + count);		}
}//然后将新对象放入Runnable对象
class CountDec implements Runnable {private ShareData data = null;public CountDec(ShareData data) {this.data = data;}@Overridepublic void run() {while (true) {data.decrement();}}
}
class CountInc implements Runnable {private ShareData data = null;public CountInc(ShareData data) {this.data = data;}@Overridepublic void run() {while (true) {data.increment();}}
}

  

b: 将这些Runnbale对象作为某一个类中的内部类,共享数据作为外部类的成员变量,每个线程对共享数据的操作也就分配给了外部类,以便实现共享数据的各种操作的互斥通信。

package com.cn.gbx;import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;public class TestThread {//将共享数据作为外部类的成员变量final private static ShareData data = new ShareData();public static void main(String[] args) {//Runnbale内部类可以共享new Thread(new Runnable() {@Overridepublic void run() {while (true) {data.decrement();}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {data.increment();}}}).start();}
}//将共享数据封装在另一个对象里面
class ShareData {private int count = 100;public synchronized void decrement() {count--;System.out.println(Thread.currentThread().getName() + " :" + count);}public synchronized void increment() {count++;System.out.println(Thread.currentThread().getName() + " :" + count);		}
}

  

 

转载于:https://www.cnblogs.com/E-star/p/3482170.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIX的完整形式是什么?

AIX:高级交互式主管 (AIX: Advanced Interactive Executive) AIX is an abbreviation of "Advanced Interactive Executive". AIX是“ Advanced Interactive Executive”的缩写 。 It is a progression sequence of proprietary UNIX operating systems …

c#生成随机字符串 用做批量申请账号时的随机密码还是相当不错的

//随机字符串生成器的主要功能如下: //1、支持自定义字符串长度 //2、支持自定义是否包含数字 //3、支持自定义是否包含小写字母 //4、支持自定义是否包含大写字母 //5、支持自定义是否包含特殊符号 //6、支持自定义字符…

【C++基础】C++11的noexcept声明符 与 异常传播

目录C noexcept:1、用途2、用法1、noexcept声明符的用法:2、noexcept运算符的用法异常传播1、异常传播的定义2、异常传播中的规则3、异常传播的代价C noexcept: 1、用途 C11使用noexcept指明函数是否抛出异常: 若函数不抛异常&a…

使用IndexReader.repen提高搜索速度

1,使用indexreader创建indexsearcher. 2,indexsearcher在使用完了以后不要关闭. 3.使用indexreader.isCurrent()判断索引是否被indexwriter改动. 4,如果索引被改动,indexsearcher.close()先前那个,然后new indexsearcher(indexreader). 传string给searcher,searcher会维护一个内…

CSS中的文本格式

CSS文字格式 (CSS text formatting) CSS text properties allow you to style your text in various ways very easily. Such as color, alignment, spacing, direction, etc. CSS文本属性使您可以轻松地以各种方式设置文本样式。 例如颜色 , 对齐方式 ,…

【C++基础】重抛异常与异常的使用场景

重抛异常 异常处理程序可以重新抛出异常。 当它无法处理该异常,或想通知它的调用者发生了一个异常,此时就需要重抛异常: 1、抛出捕获的异常 try {// statements; } catch (TheException &ex) {// Do something;throw; }2、重新抛出另一…

vi @-function

vi 的功能 vi 是一个越用越强大的东西 功能: 例: 1 在插入模式 cwgadfly CTL-V ESC 看到的似: cwgadfly^[ 2 保存到g缓冲区 ESC :退出插入模式 "gdd :"g 指缓冲去个 dd删除一行 这样g缓冲去的内容是 cwgadflayESC 3 test love u 在…

CSS简写指南

1.margin 1.1 margin:1px 2px 3px(上 左右 下) 1.2 margin:2px 3px(上下 左右) 1.2 margin:1px 3px 2px 3px(上右下左) 2.padding(同上) 3.border border:1px red solid (border-width border-color border-style) 1 2 3border-width:1px 2px 3px; //最多可用四个值…

【C++基础】模板基础与函数模板

目录初识模板函数模板函数模板实例化显式实例化隐式实例化初识模板 求两个int、float、char类型的数据的最大值: C里面要这样写: int maxInt(int x, int y); double maxDouble(double x, double y); char maxChar(char x, char y);C使用函数重载&#…

scala 函数中嵌套函数_Scala合成函数

scala 函数中嵌套函数Scala中的合成功能 (Composition function in Scala) Scala composition function is a way in which functions are composed in program i.e. mixing of more than one functions to extract some results. In Scala programming language, there are mu…

js--基础

js 0为false 非0为true null为false 非null为true js 特有with(对象){}:可以确定对象所使用的范围。for(变量 in 对象)对变量和和行为进行遍历html xhtml xml :这些都是标记型文档。DOM:document object model 文档对象模型。 dom三层模型: dom1:将…

字符串的处理[C#]

//string Str1 "友情相逢"; //string Str2 "用一生爱你"; //#region char的使用 //char a a; //Console.WriteLine("IsLetter方法判断a是否为字母:{0}", Char.IsLetter(a)); …

CentOS安全设置

CentOS安全设置 删除多余的用户和用户组,修改口令文件属性,禁止[CtrlAltDelete]重启命令,防止别人ping的方法。整理自互联网。1、删除多余的用户和用户组//删除多余用户# vi /etc/passwduserdel admuserdel lpuserdel syncuserdel shutdownus…

【设计模式之美】<Reading Notes>继承与组合

继承缺点 继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的可维护性。在这种情况下,我们应该尽量少用,甚至…

scala中何时使用下划线_在Scala中使用下划线

scala中何时使用下划线Underscore (_) character is reserved in Scala and has multiple usages in the programming language. Based on functions that use the underscore have the following usages: 下划线(_)字符在Scala中保留,并且在编程语言中有多种用法。…

如何利用C#编写网页投票器程序 如何使用代理来投票 代理IP来投票

一、前言看个图,了解下投票的过程。提交投票信息投票页 ――――――――>投票信息处理页反馈投票结果(请求页)<―――――――(响应页)一般情况下,填写投票信息,然后点提交按钮发送到响应页,这…

【设计模式之美】<Reading Notes>贫血模型与充血模型

小知识 需要了解的一些名词 1、领域驱动设计(Domain Driven Design,简称 DDD) 2、MVC 三层架构 : M 表示 Model,V 表示 View,C 表示 Controller。 它将整个项目分为三层:展示层、逻辑层、数据层…

TAFE的完整形式是什么?

TAFE:拖拉机和农用设备 (TAFE: Tractors and Farm Equipment) TAFE is an abbreviation of Tractors and Farm Equipment Limited. It is an Indian tractor manufacturer which is founded at Chennai in 1960. It is the second-largest tractor manufacturer in …

Oracle 10g 数据库的备份和还原

一、备份数据库1.在图形工具中,如sqldeveloper,pl/sqldeveloper用以下这句查找空表select alter table ||table_name|| allocate extent; from user_tables where num_rows0;2.把第一步执行得到的结果当用sql语来再次执行3.到oracle服务器上执行备份语句. 运行-cmd …

用户行为分析指导电商精细化运营

规模和利润,这两个在商业运营中最基本的指标,却在电子商务市场中遭遇了不同的待遇。前两年,几乎所有的电商企业都只追求规模,不追求利润,导 致自身的运营极其粗放,绝大多数电商公司只有两招:猛打…