最近在看进程通信这块,觉得用wait、notify、notifiAll来做进程通信挺有意思的。
现把我写的一个小例子贴出来
package com.tsing.test1; import java.util.LinkedList; public class PrintQueue { private LinkedList<String> queue = new LinkedList<String>(); public synchronized void add(String str){ queue.add(str); System.out.println("already add str "+str+" and notify to remove"); notifyAll(); } public synchronized String remove() throws InterruptedException{ while(queue.size() == 0){ System.out.println(Thread.currentThread().getName()+" is waitting ..."); wait(); } return queue.remove(); } public static void main(String[] args){ PrintQueue queue = new PrintQueue(); Printer p = new Printer(queue); new Thread(p).start(); new Thread(p).start(); for(int i = 0 ; i < 10 ; i++){ queue.add("number : "+i); } try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for(int i = 0 ; i < 10 ; i++){ queue.add("number : "+i); } } }
package com.tsing.test1; /** * 用来打印 * @author Administrator * */ public class Printer implements Runnable{ private PrintQueue queue; public Printer(PrintQueue queue){ this.queue = queue; } public void run() { while(true){ try { System.out.println(Thread.currentThread().getName() +"try to remove : "+queue.remove()); } catch (InterruptedException e) { e.printStackTrace(); } } } }
一、这上面有两个类:
1、PrintQueue
该类是打印队列类,用来添加打印字符串和打印字符串(实际是移除)。其中add方法和remove方法都是被synchronized修饰的:即对于同一个PrintQueue对象,add和remove方法是受同步保护的。
2、Printer
该类用来运行PrintQueue对象的remove方法的。
二、执行的结果(每次执行结果顺序可能会不一样)
already add str number : 0 and notify to remove
already add str number : 1 and notify to remove
Thread-1try to remove : number : 0
already add str number : 2 and notify to remove
Thread-0try to remove : number : 1
already add str number : 3 and notify to remove
already add str number : 4 and notify to remove
Thread-1try to remove : number : 2
already add str number : 5 and notify to remove
Thread-0try to remove : number : 3
already add str number : 6 and notify to remove
Thread-1try to remove : number : 4
already add str number : 7 and notify to remove
Thread-0try to remove : number : 5
already add str number : 8 and notify to remove
Thread-1try to remove : number : 6
already add str number : 9 and notify to remove
Thread-1try to remove : number : 7
Thread-1try to remove : number : 9
Thread-0try to remove : number : 8
Thread-1 is waitting ...
Thread-0 is waitting ...
already add str number : 0 and notify to remove
already add str number : 1 and notify to remove
already add str number : 2 and notify to remove
already add str number : 3 and notify to remove
already add str number : 4 and notify to remove
already add str number : 5 and notify to remove
already add str number : 6 and notify to remove
already add str number : 7 and notify to remove
already add str number : 8 and notify to remove
already add str number : 9 and notify to remove
Thread-0try to remove : number : 0
Thread-1try to remove : number : 1
Thread-1try to remove : number : 3
Thread-1try to remove : number : 4
Thread-1try to remove : number : 5
Thread-1try to remove : number : 6
Thread-1try to remove : number : 7
Thread-1try to remove : number : 8
Thread-1try to remove : number : 9
Thread-1 is waitting ...
Thread-0try to remove : number : 2
Thread-0 is waitting ...
三、分析
1、从执行结果可以看出来并不是每次执行notifyAll,wait进程就会被唤醒。
2、线程执行wait后就进入静默状态,直到notifyAll或者notify被执行
3、被synchronized修饰的方法,是已该对象实例为锁的
四、疑问
1、为啥不是每次执行notifyAll之后,wait就被唤醒???
还请知道的大牛指点一二
相关推荐
用java编写的基于socket的进程间通信程序 客户端服务器聊天小程序
java写的进程通信源码
以普通程序员身份认识高级语言VC++/Java/C#的进程创建与撤销工具。
AIDL是Android接口定义语言,它可以用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能。 实现步骤 例:用 A程序去访问 B程序的MyService.java服务 在B中...
使用Java语言编写的一款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作...
AIDL(Android Interface Definition Language)是一种接口定义语言,编译器通过*.aidl文件的描述信息生成符合通信协议的Java代码,我们无需自己去写这段繁杂的代码,只需要在需要的时候调用即可,通过这种方式我们...
Unix操作系统环境下,应用程序可以利用fork... 可以说:Java语言对应用程序多线程能力的支持增强了Java作为网络程序设计语言的优势,为实现分布式应用系统中多客户端的并发访问以及提高服务器的响应效率奠定坚实基础。
使用Java语言编写的一款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作...
Android AIDL, Android进程机制通信机制,这里就整理下AIDL 的知识,帮助大家学习理解此部分知识! 什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言。听起来很深奥,其实它的...
二、语言环境:Java 三、已知技术参数和设计要求: 1、实现一个图形用户界面局域网内的消息系统。 2、功能:建立一个局域网内的简单的P2P消息系统,程序既是服务器又是客户,服务器端口使用3000。 3、用户注册及对等...
(1) 用C语言实现对N个进程采用某种进程调度算法(如先来先服务调度、时间片轮转调度、动态优先级调度)的调度。 (2) 为了清楚地观察每个进程的调度过程,程序应将每个进程的被调度情况显示出来。 (3) 分析程序...
github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...
github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...
github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...
github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...
github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...
github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...
github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...
github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...