Java 线程间通讯(共享变量方式)
Java线程间通讯,最常用的方式便是共享变量方式,多个线程共享一个静态变量就可以实现在线程间通讯,但是这需要注意的就是线程同步问题。
一、没考虑线程同步:
package com.wyf;
public class threadConnetcion {
public static void main(String[] args) {
Q q=new Q();
//创建生产者线程
Producer p = new Producer(q);
//创建消费者线程
Consumer c = new Consumer(q);
/**
* 启动线程
*/
p.start();
c.start();
}
}
//生产者线程
class Producer extends Thread {
Q q;
public Producer(Q q) {
this.q = q;
}
public void run() {
try {
int i=0;
while(true)
{
this.sleep(3000);
q.put(i++);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//消费者线程
class Consumer extends Thread {
Q q;
public Consumer(Q q) {
this.q = q;
}
public void run() {
try {
while(true)
{
this.sleep(3000);
q.get();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Q
{
int n;
synchronized int get()
{
System.out.println("Get:"+n);
return n;
}
synchronized void put(int n)
{
this.n=n;
System.out.println("Put:"+n);
}
}
输出如下:
Put:0
Get:0
Get:0
Put:1
Put:2
Get:2
Get:2
Put:3
Get:3
Put:4
Put:5
Get:5
Put:6
Get:6
Get:6
Put:7
Put:8
Get:8
可以看到线程之间的通讯是杂乱的;
二、使用wait和notify进行线程同步:
package com.wyf;
public class threadConnetcion {
public static void main(String[] args) {
Q q=new Q();
//创建生产者线程
Producer p = new Producer(q);
//创建消费者线程
Consumer c = new Consumer(q);
/**
* 启动线程
*/
p.start();
c.start();
}
}
//生产者线程
class Producer extends Thread {
Q q;
public Producer(Q q) {
this.q = q;
}
public void run() {
try {
int i=0;
while(true)
{
this.sleep(3000);
q.put(i++);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//消费者线程
class Consumer extends Thread {
Q q;
public Consumer(Q q) {
this.q = q;
}
public void run() {
try {
while(true)
{
this.sleep(3000);
q.get();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Q
{
int n;
boolean valueSet=false;
synchronized int get()
{
while(!valueSet)
{
try
{
wait();
}
catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("Get:"+n);
valueSet=false;
notify();
return n;
}
synchronized void put(int n)
{
while(valueSet)
{
try
{
wait();
}
catch (Exception e) {
e.printStackTrace();
}
}
this.n=n;
System.out.println("Put:"+n);
valueSet=true;
notify();
}
}
输出如下:
Put:0
Get:0
Put:1
Get:1
Put:2
Get:2
Java 线程间通讯(共享变量方式)的更多相关文章
- Java 线程间通讯
/* 线程间通讯: 多个线程在处理同一资源,但是任务却不同. */ package com.cwcec.test; class Input implements Runnable { Resource ...
- Java 线程间通讯(管道流方式)
一.管道流是JAVA中线程通讯的常用方式之一,基本流程如下: 1)创建管道输出流PipedOutputStream pos和管道输入流PipedInputStream pis 2)将pos和pis匹配 ...
- JMM之Java线程间通讯——等待通知机制及其经典范式
在并发编程中,实际处理涉及两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体). 通信是指线程之间以何种机制来交换信息.在共享内存的并发模型里,线程之间共享程序的公共状 ...
- java 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)
参考文章:http://ifeve.com/java-concurrency-thread-directory/ 其中的竞态,线程安全,内存模型,线程间的通信,java ThreadLocal类小节部 ...
- 【转】JAVA 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)
原文地址:https://www.cnblogs.com/edenpans/p/6020113.html 参考文章:http://ifeve.com/java-concurrency-thread-d ...
- 黑马程序员——JAVA基础之多线程的线程间通讯等
------- android培训.java培训.期待与您交流! ---------- 线程间通讯: 其实就是多个线程在操作同一个资源,但是动作不同. wait(); 在其他线程调用此对象的notif ...
- (转载)Java里快如闪电的线程间通讯
转自(http://www.infoq.com/cn/articles/High-Performance-Java-Inter-Thread-Communications) 这个故事源自一个很简单的想 ...
- Java中快如闪电的线程间通讯
这个故事源自一个很简单的想法:创建一个对开发人员友好的.简单轻量的线程间通讯框架,完全不用锁.同步器.信号量.等待和通知,在Java里开发一个轻量.无锁的线程内通讯框架:并且也没有队列.消息.事件或任 ...
- Java线程间通信-回调的实现方式
Java线程间通信-回调的实现方式 Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互. 比如举一个简单例子,有一个多线程的 ...
随机推荐
- 关于CSS Hack
CSS Hack由于不同厂商的浏览器,如Internet Explorer,Safari,Mozilla Firefox,Chrome 等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对CSS ...
- Oracle数据库——SQL高级查询
一.涉及内容 1.掌握SELECT语句的多表连接查询. 2.掌握SELECT语句的子查询. 二.具体操作 (一)根据Oracle数据库scott方案下的emp表和dept表,完成下列操作: 1.查询所 ...
- Oboe 提升web 用户体验以及性能
Oboe 地址:http://oboejs.com/ 1.安装 bower bower install oboe 2.使用,ajax 模式 oboe('/myapp/things.json') ...
- jQuery tmpl用法总结
之前很是头疼循环数据的渲染,搞一大堆的命名,一点点的赋值,很是麻烦,今天学习了一下jQuery插件tmpl,下面抛出一些使用方法,供以后参考: 官方网址:http://web.archive.org/ ...
- C#Winform中treeView控件使用总结
1.如何展开结点时改变图标(注意:不是选中时) 要在目录中使用图标首先要加入一个控件ImageList(命名为imageList1),然后可以按图片的index或名称引用图片. 然后需要在TreeVi ...
- 修改oracle数据库密码
1.用Xshell远程连接安装数据库的服务器,切换到安装oracle数据库的用户下,(我的oracle数据库就安装在oracle用户下) 命令: su - oracle; 2.进入oracle控制台 ...
- js页面取值的三种方式
<input id=""<radio <checkbox<div<img对于这些标签内参数取值,一般分为三种类型:一.有关id取值用 #:取id处的v ...
- SQL2008安装自动退出
一同事安装sql 2008 然后删除过,后来再也装不上了,安装SQL2008操作执行到安装支持文件的时候就会出现安装过程自动退出的现象. 网上很多人说需要卸载,我看原因不一定是这个,因为根本没有安装成 ...
- ChinaUnix上的帮助手册还不错!
无意中发现ChinaUnix上的Linux帮助手册还真不错啊,有时间多看一看: http://man.chinaunix.net/linux/debian/debian_learning/index. ...
- systemd的原理和适用方法
systemd的原理: https://www.linux.com/learn/tutorials/527639-managing-services-on-linux-with-systemd htt ...