`

java语言进程通信学习

阅读更多

最近在看进程通信这块,觉得用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的进程通信.zip

    在Java编程语言中,进程通信(Process Communication)是多进程应用程序之间交换信息的方式。Java提供了多种机制来实现进程间的通信,这些机制可以帮助开发者构建复杂的分布式系统。本资料包"基于Java的进程通信.zip...

    java进程通信.zip

    在Java编程语言中,进程通信(Process Communication)是多进程应用程序中的关键概念,它涉及到不同进程间的信息交换和协调。Java提供了多种方式来实现进程间的通信,这些方式可以帮助开发者构建复杂的分布式系统和...

    Java基于socket的进程间通信 聊天小程序

    Java基于Socket的进程间通信(IPC)是一种网络编程技术,常用于实现客户端和服务器之间的通信。...通过对这些代码的学习和分析,你可以更深入地理解Java中的Socket通信以及如何构建一个简单的聊天应用。

    操作系统进程通信Java源码

    在这个主题中,我们将深入探讨Java语言在实现进程通信中的应用。 在Java中,进程通信主要通过以下几种方式实现: 1. **管道(Pipes)**:Java提供了`java.io.PipedInputStream`和`java.io.PipedOutputStream`类,...

    基于java的进程间异步通信系统的设计与实现

    Java作为一种广泛使用的编程语言,提供了多种实现进程间异步通信的方式。本篇文章将深入探讨基于Java的进程间异步通信系统的设计与实现,特别关注其在Android环境中的应用。 首先,我们需要理解什么是进程间通信。...

    基于java的进程通信.zip

    在Java编程语言中,进程通信(Process Communication)是多进程应用程序之间交换数据的重要机制。Java提供了多种方式来实现进程间的通信,这些方法使得不同的程序能够协同工作,共享资源,提高系统的整体效率。以下...

    java源码:进程通信.rar

    在Java编程语言中,进程通信(Process Communication)是多线程和分布式系统中不可或缺的一部分。这个"java源码:进程通信.rar"文件可能包含了用于演示或教学如何在Java中实现不同进程间通信的示例代码。下面我们将...

    Java模拟操作系统(内存管理,进程管理,文件管理,进程通信)

    Java模拟操作系统是一个基于Java编程语言实现的微型操作系统模型,它主要涵盖了四个核心领域:内存管理、进程管理、文件管理和进程通信。这样的项目旨在帮助开发者理解操作系统的工作原理,并提供了一个实践平台来...

    基于Java的实例源码-进程通信.zip

    在IT领域,进程通信是操作系统中的重要概念,特别是在多线程和分布式系统中。Java作为一门广泛使用的编程语言,提供了...这个压缩包可能包含了演示各种通信方式的示例代码,对于学习和理解Java进程通信具有很高的价值。

    java语言程序设计课后习题答案.pdf

    "Java语言程序设计课后习题答案.pdf" Java语言程序设计课后习题答案.pdf是Java语言程序设计课程的习题答案集,旨在帮助学生更好地理解和掌握Java语言的基本概念和编程技术。本文档涵盖了Java语言的基础知识、面向...

    java网络即时通信系统

    Java网络即时通信系统是一种基于Java技术构建的实时通信平台,它允许用户通过互联网进行快速、高效的数据交换。这种系统通常采用客户端-服务器架构,能够支持多种通信协议,如TCP/IP、HTTP、WebSocket等,以实现不同...

    Android跨进程通信demo

    本示例"Android跨进程通信demo"通过8个工程深入探讨了这些通信方式,并结合Java设计模式,提供了丰富的学习材料。 1. **Binder**:Android系统的核心IPC机制,它允许一个进程的对象被其他进程调用,就像对象在本地...

    Android Studio AIDL实现跨进程通信

    在Android系统中,跨进程通信(IPC,Inter-Process Communication)是必不可少的,尤其是在开发大型、复杂的应用程序时。Android Interface Definition Language(AIDL)就是Android为开发者提供的一种强大的工具,...

    Java操作系统课设之模拟进程管理系统

    在本项目"Java操作系统课设之模拟进程管理系统"中,我们主要探讨了如何利用Java编程语言来模拟实际操作系统中的进程管理功能。这是一个典型的计算机科学与技术领域的实践课题,旨在帮助学生深入理解操作系统的原理,...

    JAVA进程管理

    6. **进程通信**:Java提供了多种进程间通信(IPC)方式,如管道(Pipes)、套接字(Sockets)、共享内存等,这些通信机制可以帮助进程之间交换数据,协作完成任务。 7. **进程监控**:Java可以利用Runtime或...

    java写的进程通信源码

    在Java编程语言中,进程通信(Process Communication)是多进程应用程序之间交换信息的一种技术。它允许不同的Java虚拟机(JVM)或者同一JVM内的不同线程之间进行数据交互。本资源包含的是Java实现的进程通信源码,...

    Java实现进程同步

    Java作为一种强大的多线程编程语言,提供了丰富的API来支持进程同步。本篇文章将深入探讨如何使用Java实现“生产者-消费者”问题的进程同步。 生产者-消费者问题是多线程设计模式中的一个经典案例,它模拟了两个...

    进程调度程序 Java

    在这个场景中,我们关注的是一个使用Java编程语言实现的进程调度程序。Java作为一种跨平台的高级编程语言,非常适合开发这种系统级的应用。 进程调度的主要目标包括提高系统吞吐量、减少进程等待时间以及保持响应...

    nodejs父子进程的stream方式通信.zip_cameraodl_nodejs 进程通信_nodejs父子进程通信_spa

    本文将深入探讨如何使用stream方式实现Node.js中的父子进程通信,特别是针对使用`spawn`方法创建的子进程。首先,我们了解下父子进程的概念。 **父子进程**: 在操作系统中,一个已经存在的进程(父进程)可以创建...

    守护进程(java)

    守护进程在Linux或Unix等类Unix系统中广泛存在,但Java作为一种跨平台的语言,其本身并不直接支持守护进程的概念。不过,由于Java的跨平台特性,开发者可以通过模拟实现类似的功能。 在Java中,我们可以利用线程...

Global site tag (gtag.js) - Google Analytics