java笔记--关于线程通信
关于线程通信
使用多线程编程的一个重要原因就是线程间通信的代价比较小
--如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897773.html "谢谢--
关键技术:
yield(): Thread类的一个静态方法,用来暂停当前正在执行的线程对象,并执行其他线程
public static void yield(){}
代码实例:
实现线程间的发送和接收消息
package com.xhj.thread; /**
* 线程之间的通信 Thread.yeild()暂停当前线程,执行其他线程
*
* @author XIEHEJUN
*
*/
public class CommunicationThread { /**
* 发送线程类
*
* @author XIEHEJUN
*
*/
private class SendThread implements Runnable {
private String[] products = { "java宝典", "C#宝典", "C宝典", "C++宝典",
"Pyhtion宝典" };
private volatile String productName;
private volatile boolean sendState; public String getProductName() {
return productName;
} public void setSendState(boolean sendState) {
this.sendState = sendState;
} public boolean isSendState() {
return sendState;
} @Override
public void run() {
for (int i = 0; i < 5; i++) {
while (sendState) {
Thread.yield();
}
productName = products[i];
System.out.println("发送:" + productName);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sendState = true;
}
}
} /**
* 接受线程类
*
* @author XIEHEJUN
*
*/
private class ReceiveThrend implements Runnable {
private SendThread send; public ReceiveThrend(SendThread send) {
this.send = send;
} @Override
public void run() {
for (int i = 0; i < 5; i++) {
while (!send.isSendState()) {
Thread.yield();
}
System.out.println("接收:" + send.getProductName());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
send.setSendState(false);
} } } /**
* 调用线程
*/
public void useThread() {
SendThread send = new SendThread();
ReceiveThrend receive = new ReceiveThrend(send);
System.out.println("线程1");
Thread thread1 = new Thread(send);
thread1.start();
System.out.println("线程2");
Thread thread2 = new Thread(receive);
thread2.start();
} public static void main(String[] args) {
// TODO Auto-generated method stub
CommunicationThread communicationThread = new CommunicationThread();
communicationThread.useThread(); }
}
注:线程间的通信重点关注通信的内容,要确保其是同步的,而且各个线程对该资源使用后是要及时释放的,
否则将会出现死锁现象。而且在实际应用当中,商品的信息通常都是存储在数据库中的。
java笔记--关于线程通信的更多相关文章
- Java并发基础--线程通信
java中实现线程通信的四种方式 1.synchronized同步 多个线程之间可以借助synchronized关键字来进行间接通信,本质上是通过共享对象进行通信.如下: public class S ...
- Java并发包——线程通信
Java并发包——线程通信 摘要:本文主要学习了Java并发包里有关线程通信的一些知识. 部分内容来自以下博客: https://www.cnblogs.com/skywang12345/p/3496 ...
- java 笔记(5) —— 线程,yield,join
一.线程各个状态与转换: 新建状态:用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存 .就绪状态:当一个线程创建了以后,其他的线程调用了它的start() ...
- java笔记--使用线程池优化多线程编程
使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库 ...
- java笔记--守护线程的应用
守护线程的应用 Java中的线程可以分为两类,即用户线程和守护线程.用户线程是为了完成任务,而守护线程是为其他线程服务 --如果朋友您想转载本文章请注明转载地址"http://www.cnb ...
- Java基础教程——线程通信
线程通信:等待.唤醒 Object方法 这些方法在拥有资源时才能调用 notify 唤醒某个线程.唤醒后不是立马执行,而是等CPU分配 wait 等待,释放锁,不占用CPU资源 notifyAll 唤 ...
- Java并发读书笔记:线程通信之等待通知机制
目录 synchronized 与 volatile 等待/通知机制 等待 通知 面试常问的几个问题 sleep方法和wait方法的区别 关于放弃对象监视器 在并发编程中,保证线程同步,从而实现线程之 ...
- Java中实现线程通信的三个方法的作用是什么?
Java提供了3个方法解决线程之间的通信问题,均是java.lang.Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常. 方法名 作 用 final void wait() ...
- java 多线程:线程通信-等待通知机制wait和notify方法;(同步代码块synchronized和while循环相互嵌套的差异);管道通信:PipedInputStream;PipedOutputStream;PipedWriter; PipedReader
1.等待通知机制: 等待通知机制的原理和厨师与服务员的关系很相似: 1,厨师做完一道菜的时间不确定,所以厨师将菜品放到"菜品传递台"上的时间不确定 2,服务员什么时候可以取到菜,必 ...
随机推荐
- 第六章 prototype和constructor
首先我们看下面一段代码(第六章 01.htm) function myfun() //定义一个函数myfun { }; console.log(typeof (myfun.prototype)); c ...
- jQuery问题:$XXX is not a function
用火狐浏览器打开,js代码一段不执行,F12以后看见下面的错误: 网上查看说是jQuery文件引用的问题,把jQuery.js引入语句修改了一下,果然没有错了. 我原来的引用语句是:<scrip ...
- js中的this中使用
请先查看:http://www.jb51.net/article/41656.htm 情况一:纯粹的函数调用 这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global. 情况二:作 ...
- [BZOJ2879][Noi2012]美食节(最小费用最大流动态加边)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2879 分析: 和bzoj1070一样,但这题的数据范围大了很多,如果直接建图就会TLE ...
- 7、面向对象以及winform的简单运用(委托)
委托 1.概念: 委托可以看成是一个函数的“容器”,将某一具体的函数“装入”后,就可以把它当成函数一样使用.委托变量可看成是一种类型安全的函数指针,它只能接收符合其要求的函数地址. 2.定义方法:de ...
- WCF 入门(29)
前言 最近工作比较忙,加了会班就不想再写东西了,就想洗洗睡. 但是这个视频真的不能断,不能像过去一样写了几集就停了. 现在公司在做一个MVC框架的项目,话说已经一年没有写MVC了,重新上手的感觉还可以 ...
- Jquery-获取子元素children,find
1.查找子元素方式1:> 例如:var aNods = $("ul > a");查找ul下的所有a标签 2.查找子元素方式2:children() 3.查找子元素方式3 ...
- Myeclipse-导入spring
1.导入spring事物管理类库(spring 2.0(*) AOP) 点击项目右键->Build Path->Add librarys: 打开Add Libraries对话框,然后选定 ...
- python 变量命名规范
python源码和其他一些书籍,命名各种个性,没有一个比较统一的命名规范.于是总结了一些,供参考. 模块名: 模块应该使用尽可能短的.全小写命名,可以在模块命名时使用下划线以增强可读性.同样包的命名也 ...
- Git删除文件操作
使用Git删除文件需要使用Git rm命令来实现,最后git commit 需要注意的是直接rm命令删除后是不可以的,可以用git status 命令尝试一下,效果如图下(创建了test文件,演示了g ...