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 线程间通讯(共享变量方式)的更多相关文章

  1. Java 线程间通讯

    /* 线程间通讯: 多个线程在处理同一资源,但是任务却不同. */ package com.cwcec.test; class Input implements Runnable { Resource ...

  2. Java 线程间通讯(管道流方式)

    一.管道流是JAVA中线程通讯的常用方式之一,基本流程如下: 1)创建管道输出流PipedOutputStream pos和管道输入流PipedInputStream pis 2)将pos和pis匹配 ...

  3. JMM之Java线程间通讯——等待通知机制及其经典范式

    在并发编程中,实际处理涉及两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体). 通信是指线程之间以何种机制来交换信息.在共享内存的并发模型里,线程之间共享程序的公共状 ...

  4. java 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)

    参考文章:http://ifeve.com/java-concurrency-thread-directory/ 其中的竞态,线程安全,内存模型,线程间的通信,java ThreadLocal类小节部 ...

  5. 【转】JAVA 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)

    原文地址:https://www.cnblogs.com/edenpans/p/6020113.html 参考文章:http://ifeve.com/java-concurrency-thread-d ...

  6. 黑马程序员——JAVA基础之多线程的线程间通讯等

    ------- android培训.java培训.期待与您交流! ---------- 线程间通讯: 其实就是多个线程在操作同一个资源,但是动作不同. wait(); 在其他线程调用此对象的notif ...

  7. (转载)Java里快如闪电的线程间通讯

    转自(http://www.infoq.com/cn/articles/High-Performance-Java-Inter-Thread-Communications) 这个故事源自一个很简单的想 ...

  8. Java中快如闪电的线程间通讯

    这个故事源自一个很简单的想法:创建一个对开发人员友好的.简单轻量的线程间通讯框架,完全不用锁.同步器.信号量.等待和通知,在Java里开发一个轻量.无锁的线程内通讯框架:并且也没有队列.消息.事件或任 ...

  9. Java线程间通信-回调的实现方式

    Java线程间通信-回调的实现方式   Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互.   比如举一个简单例子,有一个多线程的 ...

随机推荐

  1. Cobertura 代码覆盖率测试

    Cobertura 是一种开源工具,它通过检测基本的代码,并观察在测试包运行时执行了哪些代码和没有执行哪些代码,来测量测试覆盖率.除了找出未测试到的代码并发现 bug 外,Cobertura 还可以通 ...

  2. js中冒泡事件和捕获事件

    js中冒泡事件和捕获事件: 冒泡事件:冒泡事件是从里向外,即是从被绑定元素开始一直向外到达页面的所有祖先元素都会被触发,这 一过程被称为事件冒泡.这个事件从原始元素开始一直冒泡到DOM树的最上层 捕获 ...

  3. Junit手动/自动加载spring配置文件

    分配置文件在classpath下和web-inf下两种情况的加载: ApplicationContext context = new FileSystemXmlApplicationContext(& ...

  4. selenium+python自动化之pycharm

    方法: 1.注册机界面,选择License serve.填入http://www.cnblogs.com/testdream/ 2.点击ok 3.注册界面选择:Activation coede 4.打 ...

  5. Linux 实现自动安装服务组件以及优化内核参数 (转)

    安装好Linux裸机后(安装请参考:http://blog.itpub.net/26230597/viewspace-1380155/),还需要在其上安装一些基础组件,一般是手动一个个安装,比较繁复也 ...

  6. 51nod 1314 定位系统

    一个国家有N个城市(标号为0~N-1),这N个城市恰好由N-1条道路连接在一起(即N个城市正好构成一个树状结构).这个国家的所有道路的长度都是1个长度单位.定义:两个城市间的距离是两个城市间的最短路的 ...

  7. 网页颜色RGB记法和16进制记法转化方法

    A=>10,B=>11,C=>12,D=>13,E=>14,F=>15 看一个例子: 254,112,85 255/16 等于 15 余 14 那么它对应的应该是F ...

  8. 【log】logback.xml

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 控制台 - ...

  9. 黄聪:wordpress如何添加自定义文章快速编辑按钮

    When working with WordPress posts and you want to quickly change the status or date of one or more p ...

  10. CE_现金银行总行分行设定详解(案例)

    2014-07-14 Created By BaoXinjian