java 线程间变量共享_多线程:(五)多个线程之间共享数据
简单的总结一下多线程共享数据的方式。其实,最重要的,是一个思想,一个面向对象的编程思想的建立。
说两点:
一、如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。
/**
* 卖票处理
* @author yang
*/
public class SellTicket {
//卖票系统,多个窗口的处理逻辑是相同的
public static void main(String[] args) {
Ticket t = new Ticket();
new Thread(t).start();
new Thread(t).start();
}
}
/**
* 将属性和处理逻辑,封装在一个类中
* @author yang
*/
class Ticket implements Runnable{
private int ticket = 10;
public synchronized void run() {
while(ticket>0){
ticket--;
System.out.println("当前票数为:"+ticket);
}
}
}
打印结果:
当前票数为:9
当前票数为:8
当前票数为:7
当前票数为:6
当前票数为:5
当前票数为:4
当前票数为:3
当前票数为:2
当前票数为:1
当前票数为:0
二,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计2个线程。一个线程对j增加1,另外一个线程对j减1,银行存取款。
/**
* 一个线程加1,一个线程减1
* @author yang
*/
public class MultiThreadShareData {
public static void main(String[] args) {
ShareData data = new ShareData();
new Thread(new MyRunnable1(data)).start();
new Thread(new MyRunnable2(data)).start();
}
}
class MyRunnable1 implements Runnable {
private ShareData data;
public MyRunnable1(ShareData data) {
this.data = data;
}
public void run() {
data.decrement();
}
}
class MyRunnable2 implements Runnable {
private ShareData data;
public MyRunnable2(ShareData data) {
this.data = data;
}
public void run() {
data.increment();
}
}
class ShareData {
private int j = 10;
public synchronized void increment() {
j++;
System.out.println("线程:" + Thread.currentThread().getName() + "加操作之后,j = " + j);
}
public synchronized void decrement() {
j--;
System.out.println("线程:" + Thread.currentThread().getName() + "加操作之后,j = " + j);
}
}
关键还是思想:将共享数据和处理逻辑,封装在一个类中。业务逻辑(即加1的线程和减1的线程操作)在执行时,直接调用该类中的处理逻辑。这样做,更符合面向对象,更易于维护。
总结一下,对于多线程间对共享变量的操作,还是要实现互斥,使得对该共享变量的操作,实现原子性即可。
好了,简洁总结,深刻理解。有不对的地方,欢迎指出,在此谢过。
那时年少轻狂,把喜欢当做筹码,才敢肆无忌惮的任性。
----那时年少轻狂
java 线程间变量共享_多线程:(五)多个线程之间共享数据相关推荐
- java线程的创建线程_多线程(Thread、线程创建、线程池)
第1章 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序, ...
- Linux 多线程(一)线程概念:线程概念、线程与进程、线程间的独有与共享、多线程与多进程、线程控制
线程概念 线程与进程 线程间的独有与共享 多线程与多进程 线程控制 线程概念 什么是线程 线程是进程中的一条执行流,执行程序中的某部分代码.linux下没有具体实现的线程,只有库函数用pcb来实现的线 ...
- java线程 cpu占用率_多线程程序 怎样查看每个线程的cpu占用
可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的 ...
- java线程间通信管道_通过管道进行线程间通信
管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另一个线程从输入管道中读数据.通过管道,实现不同线程间的通信,而无须借助类似共享变量.临时文件之 ...
- java线程中的常用方法_[多线程] 线程中的常用方法-最详细
线程中常用的方法 1.public void start() 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 2.public void run() 如果该线程是使用独立的 Runna ...
- 高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll
文章目录 概述 解决办法 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析 中分析了假死的原因,这里我们来看下改如何解决在多线程下出现的这 ...
- java 监控对象是什么_多线程-Java中的对象监视器是什么意思? 为什么要使用这个词?...
多线程-Java中的对象监视器是什么意思? 为什么要使用这个词? 在阅读有关Java线程的文章时,我经常注意到这样的表达:"当前线程是该对象的监视器的所有者". 我的意思是:线程有 ...
- 线程中如何使用对象_多线程中如何使用gdb精确定位死锁问题
在多线程开发过程中很多人应该都会遇到死锁问题,死锁问题也是面试过程中经常被问到的问题,这里介绍在c++中如何使用gdb+python脚本调试死锁问题,以及如何在程序运行过程中检测死锁. 首先介绍什么是 ...
- java map集合 事务控制_对象回收过程?线程池执行过程? map原理?集合类关系?synchronized 和 volatile ? 同一个类的方法事务传播控制还有作用吗?java 锁...
1. 对象回收过程? 可达性分析算法: 如果一个对象从 GC Roots 不可达时,则证明此对象不可用. 通过一系列称为GC ROOTS的对象作为起点,从这些起点往下搜索,搜索走过的路径 称为引用链 ...
- java 线程池 初始大小_为什么tomcat的默认线程池大小如此之大? - java
我注意到默认的tomcat 7线程池大小似乎是200. 但是普通的CPU似乎有16个内核. 因此只能并行执行16个线程 为什么tomcat使用那么多线程. 参考方案 多年以来,许多单核计算机问世,并且 ...
最新文章
- Django 1.11 bootstrap样式文件无法加载问题解决
- DB2的日志理解难点
- 版权监控中心怎么关闭_防火门监控系统让消防通道疏散更安全
- 生成一个文件 保存在指定的文件夹中 思路 python
- 服务器显示禁止设置多个ip地址,服务器禁止设置多个ip解决办法
- 【转载】Spring Cloud底层原理
- android gps转换度分秒,如何将GPS数据转换为度分秒
- 数据太大?你该了解Hadoop分布式文件系统
- android访问链接,尝试使用Android访问本地Web服务时连接被拒...
- JAVA实现简单计算器布局与功能(附完整源码)
- js判断数组是否为空
- ABAPDEMO批量更改BOM组件_SAP刘梦_新浪博客
- git commit 提交信息写错,怎么更改?
- 幕布图像大小与投影仪亮度关系对应表,--怎样选投影机和银幕不用愁了
- R语言使用dplyr包计算dataframe分组聚合四分位距IQR值(四分位距(interquartile range, IQR),又称四分差)
- python中 “按位与,或,异或”与C语言的不同
- 股票北向资金数据接口在哪里?
- FPGA校招笔试题分析
- 游戏技术汇:莉莉丝COO张昊解剖《刀塔传奇》开发经验心得
- elixir添加erlang模块
热门文章
- 计算机工程学院文艺例会,信息快讯 | 喜迎学代会-信息与计算机工程学院学生会组织召开第二次全体工作例会...
- 免费无账号直接使用openAI的chatGPT
- 求职信结尾经常用到的十句话
- win10卸载程序时提示找不到xxx.msi文件
- 聊一聊 C++ 中的 namespace
- 弱电机房可视化监控综合管理系统设计方案
- Python抓取淘女郎网页信息以及代码下载
- 增长奥秘:滴滴当年如何挖掘最有效的渠道和增长方法?
- 服务器里vm启动不了共享虚拟机,VMware Workstation Server共享服务不能启动
- CATT eCATT