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线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互. 比如举一个简单例子,有一个多线程的 ...
随机推荐
- 【MySQL】常见的mysql 进程state
Analyzing 线程是对MyISAM 表的统计信息做分析(例如, ANALYZE TABLE ). checking permissions 线程是检查服务器是否具有所需的权限来执行该语句. Ch ...
- RSA openssl_public_encrypt false
这个问题困扰了我好久,最后发现,原来这个函数只能最大长度为117个字节.如果加密的串超过这个长度,就会返回false.
- C#文件系统管理
目录 前言 Directory类和DirectoryInfo类 File类和FileInfo类 Path类 前言 管理文件系统主要是对计算机中文件和目录的管理,例如,读取文件信息.删除文件和读取目录信 ...
- Oracle RAC环境的日志体系
转摘:http://blog.itpub.net/22664653/viewspace-722463/ 在Oracle RAC环境中比单个系统的日志体系要复杂:见下图: 简单介绍一下有关Oracle集 ...
- Elasticsearch安装和使用
Elasticsearch安装和使用 Elasticsearch 是开源搜索平台的新成员,实时数据分析的神器,发展迅猛,基于 Lucene.RESTful.分布式.面向云计算设计.实时搜索.全文搜索. ...
- DHCP协议讲解
一.DHCP服务介绍: DHCP为动态主机配置协议,该协议能自动配置主机的IP地址.子网掩码.网关及DNS服务器等TCP/IP信息.DHCP可以降低客户机IP地址配置的复杂度和网络管理成本. DHCP ...
- 求助:为什么我用360浏览器和UC浏览器打不开JAVA中的index.html文件? 一打开就显示浏览器首界页
如下图,在oracle官网下载了一个JAVA的API文档,双击index.html时打开是浏览器的首页,不知道为什么?请问怎样才能以chm文档格式显示?
- cgic 写CGI程序
CGIC是C语言CGI库函数,用于编写CGI程序 CGIC 主要完成以下功能: * 对数据进行语法分析 * 接收以 GET 和 PSOT 两种方式发送的数据 * 把 FORM 中的不同域连接成连续的串 ...
- 兼容所有浏览器---无缝上下左右交叉运动----原生js+css
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 在指定路径下查找并打印mdb类型文件
1 #encoding:utf8 import os fpath = 'D:\Download\LP传奇-麒麟传说\Date' rfile = '' files = [] mdbFiles = [] ...