关于线程通信

使用多线程编程的一个重要原因就是线程间通信的代价比较小

--如果朋友您想转载本文章请注明转载地址"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笔记--关于线程通信的更多相关文章

  1. Java并发基础--线程通信

    java中实现线程通信的四种方式 1.synchronized同步 多个线程之间可以借助synchronized关键字来进行间接通信,本质上是通过共享对象进行通信.如下: public class S ...

  2. Java并发包——线程通信

    Java并发包——线程通信 摘要:本文主要学习了Java并发包里有关线程通信的一些知识. 部分内容来自以下博客: https://www.cnblogs.com/skywang12345/p/3496 ...

  3. java 笔记(5) —— 线程,yield,join

    一.线程各个状态与转换: 新建状态:用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存 .就绪状态:当一个线程创建了以后,其他的线程调用了它的start() ...

  4. java笔记--使用线程池优化多线程编程

    使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库 ...

  5. java笔记--守护线程的应用

    守护线程的应用 Java中的线程可以分为两类,即用户线程和守护线程.用户线程是为了完成任务,而守护线程是为其他线程服务 --如果朋友您想转载本文章请注明转载地址"http://www.cnb ...

  6. Java基础教程——线程通信

    线程通信:等待.唤醒 Object方法 这些方法在拥有资源时才能调用 notify 唤醒某个线程.唤醒后不是立马执行,而是等CPU分配 wait 等待,释放锁,不占用CPU资源 notifyAll 唤 ...

  7. Java并发读书笔记:线程通信之等待通知机制

    目录 synchronized 与 volatile 等待/通知机制 等待 通知 面试常问的几个问题 sleep方法和wait方法的区别 关于放弃对象监视器 在并发编程中,保证线程同步,从而实现线程之 ...

  8. Java中实现线程通信的三个方法的作用是什么?

    Java提供了3个方法解决线程之间的通信问题,均是java.lang.Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常. 方法名 作 用 final void wait() ...

  9. java 多线程:线程通信-等待通知机制wait和notify方法;(同步代码块synchronized和while循环相互嵌套的差异);管道通信:PipedInputStream;PipedOutputStream;PipedWriter; PipedReader

    1.等待通知机制: 等待通知机制的原理和厨师与服务员的关系很相似: 1,厨师做完一道菜的时间不确定,所以厨师将菜品放到"菜品传递台"上的时间不确定 2,服务员什么时候可以取到菜,必 ...

随机推荐

  1. javascript中的闭包,超简单论述,保证小学生必懂

    js中的闭包已经有很多论断了,大家伙有没有听懂了,先引用一片比较高端 的 ”汤姆大叔“  深入理解JavaScript系列(16):闭包(Closures) 好了,为了引起大家的兴趣,先来小诗一首 v ...

  2. QQ第三方登录

    QQ第三方登录 在Android应用程序的开发过程中,很多时候需要加入用户登录/注册模块.除了自己动手设计登录界面并实现相应功能外,现在还可以借助百度.腾讯等开发者平台提供的第三方账号登录模块.最近研 ...

  3. Linq之延迟加载特性

    目录 写在前面 系列文章 延迟加载 总结 写在前面 上篇文章介绍了linq中常见的几个关键字,并列举了几个例子,算是对linq如何使用有了初步了解.上篇文章中也提到了,能够使用linq的场合有一个要求 ...

  4. 第三十四课:jQuery Deferred详解2

    上一课主要分析了jQuery1.51版本的jQuery Deferred.在jQuery1.6中,jQuery Deferred添加了两个方法,always,pipe. always用来添加回调,无论 ...

  5. 实用的JS代码段(表单篇)

    整理了下比较实用的Javascript代码段,完整的代码参考 1 多个window.onload方法 由于onload方法时在页面加载完成后,自动调用的.因此被广泛的使用,但是弊端是只能实用onloa ...

  6. G-nav-04

    'use strict';define([ 'jquery'], function($) { var nav = { init : function() { $("#burger-menu& ...

  7. 更改PATH后,别忘了及时重启或刷新

    在windows环境下配了MinGW gcc编译器,结果编译时总提示找不到头文件.第一反应就是更改环境变量,但是将gcc目录添加到PATH中,再次运行编译依旧报错.多方查找后发现这样一句话:PATH在 ...

  8. Teradata 语句简单优化

    Teradata 基本查询语言和SQL server 是一致的.有很小的区别. 功能没有SQL 全面,界面没有SQL 好看~ 1. teradata 里面经常会报一种错误: no enough spo ...

  9. 学习笔记-动态树Link-Cut-Tree

    --少年你有梦想吗? --少年你听说过安利吗? 安利一个集训队讲解:http://wenku.baidu.com/view/75906f160b4e767f5acfcedb 关于动态树问题,有多种方法 ...

  10. BZOJ-1061 志愿者招募 线性规划转最小费用最大流+数学模型 建模

    本来一眼建模,以为傻逼题,然后发现自己傻逼...根本没想到神奇的数学模型..... 1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 ...