`
cy729215495
  • 浏览: 129209 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

有关java多线程通讯的总结

阅读更多

   线程之间的通讯,常见的是生产者,消费者模型。

package com.cgroup.thread;

public class PC {

	public static void main(String[] args) {
		Q q = new Q();
		Consumer c = new Consumer(q);
		Producer p = new Producer(q);
	}

}

class Q {

	int n;
	boolean isValid;

	public synchronized int getN() {
		while (!isValid) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("get n:" + n);
		isValid = false;
		this.notify();
		return n;
	}

	public synchronized void setN(int n) {
		while (isValid) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		this.n = n;
		System.out.println("set n:" + n);
		isValid = true;
		this.notify();
	}

}

class Consumer extends Thread {
	Q q;

	public Consumer(Q q) {
		this.q = q;
		start();
	}

	public void run() {
		int i = 0;
		for (int j = 0; j < 10; j++) {
			q.setN(i++);
		}
	}
}

class Producer extends Thread {

	Q q;

	public Producer(Q q) {
		this.q = q;
		start();
	}

	public void run() {
		for (int i = 0; i < 10; i++) {
			q.getN();
		}
	}
}

还有一种是通过流,来实现线程之间的通讯。

 

package com.cgroup.thread;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

public class Pipe {

	public static void main(String[] args) throws Exception {

		PipedInputStream in = new PipedInputStream();
		PipedOutputStream out = new PipedOutputStream(in);
		Sender s = new Sender(out);
		Receiver r = new Receiver(in);
		Thread thread1 = new Thread(s);
		Thread thread2 = new Thread(r);
		thread1.start();
		thread2.start();
	}

}

class Sender implements Runnable {

	OutputStream out;

	public Sender(OutputStream out) {
		this.out = out;
	}

	public void run() {
		int value;

		try {
			for (int i = 0; i < 5; i++) {
				double tmp=Math.random() ;
				value = (int) (tmp*256);
				out.write(value);
				System.out.println("send:" + value);
				Thread.sleep((long) (Math.random() * 1000));
			}
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}
}

class Receiver implements Runnable {

	InputStream in;

	public Receiver(InputStream in) {
		this.in = in;
	}

	public void run() {
		int value;

		try {
			while ((value = in.read()) != -1) {
				System.out.println("received:" + value);
			}
			System.out.println("pipe closed");
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}
 

 

 

1.并不一定是,写数据需要保护,读数据就不需要保护。读,写,都需要保护

2.引发线程阻塞的原因有,调用了sleep方法,调用了wait方法,io操作,线程执行一个已经被锁住了的方法或者同步块。

 

 

 

 

分享到:
评论

相关推荐

    java Socket多线程通讯实例

    总结起来,Java Socket多线程通讯实例展示了如何利用Java的网络编程API实现TCP通信,并通过多线程处理并发连接,这在构建例如QQ这样的聊天应用时是非常重要的技术。通过这种方式,服务端能够有效地管理大量并发的...

    java多线程+Socket实现的漂亮QQ

    ### Java多线程+Socket实现的漂亮QQ #### 技术要点分析 ##### 1. Java Swing Java Swing 是一个用于构建图形用户界面 (GUI) 的轻量级组件集,它为开发人员提供了丰富的功能来设计复杂的用户界面。在本项目中,...

    Java Socket实战之二 多线程通信 .

    总结来说,Java Socket的多线程通信是一个关键的网络编程概念,它使得服务器能够同时处理多个客户端请求,提高了服务的响应速度和并发能力。结合特定的工具如XtreamXml,可以进一步优化数据的传输和处理效率。

    java线程知识点总结[归类].pdf

    Java 线程知识点总结 Java 线程是一种轻量级的进程...本文总结了 Java 线程的基本概念、创建线程的方式、多线程的运行特性、五种线程状态、同步机制和线程间通讯等知识点,为读者提供了一个系统的 Java 线程知识框架。

    zeromq中多线程的jave实现

    总结来说,这个项目展示了如何使用zeromq的jeromq库在Java中实现多线程的经销商-路由器模式。它提供了一个基础的架构,可以扩展到更复杂的分布式系统,处理高并发请求,并实现高效的消息传递。通过理解zeromq的通信...

    同步异步多线程SOCKET通讯

    提供的"同步异步多线程SOCKET通讯.txt"文件可能包含实际的示例代码,展示了如何在Python、Java或C++等语言中实现同步和异步多线程Socket通信。这些代码可能包括创建Server端的Socket监听,创建并管理线程池,处理...

    萌新的多线程总结.xmind

    小白学习java多线程的写的文档总结。线程通讯,线程状态,线程安全,线程池,以及多线程的使用方法啊

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细介绍与知识点总结.mp4 │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致...

    基于Java的Modbus通讯

    在Java中,`synchronized`关键字用于控制多线程对共享资源的访问,确保同一时间只有一个线程可以执行特定代码块。这主要涉及到Java内存模型(JMM)中的锁机制,包括监视器锁(Monitor)和互斥量,以及happens-before...

    实现多线程之间通讯第二节

    在Java编程语言中,多线程是并发执行的程序组件,它们可以共享资源并相互协作完成复杂的任务。在多线程环境下,线程间的通信至关重要,以确保数据的一致性和程序的正确性。本节主要讲解如何使用`wait()`和`notify()`...

    qt与java之间socket通讯

    总结,Qt与Java之间的Socket通信涉及了网络编程、JSON序列化和反序列化、多线程处理(特别是在Java中处理并发连接时)、以及错误处理等多个技术点。理解并熟练掌握这些知识点,可以构建可靠的跨平台通信系统。

    基于Java的即时通讯系统设计与实现【文献综述】.doc

    【总结】基于Java的即时通讯系统设计与实现结合了Java语言的优势,能够构建稳定、高效的即时通讯平台,满足用户多样化的需求。从娱乐、社交到商务应用,Java的即时通讯系统在现代社会中扮演着日益重要的角色。

    serversocket单线程跟多线程例子

    本文将深入探讨`ServerSocket`在单线程和多线程环境下的应用,以及它们各自的特点和适用场景。 首先,我们来看`ServerSocket`的单线程例子。在单线程模式下,服务器只有一个线程来处理所有客户端的连接请求。这通常...

    JAVA的即时通讯源代码

    在Java中实现即时通讯,通常涉及网络编程,包括TCP或UDP协议的使用,以及多线程技术来处理并发连接。以下是对给定源代码的详细解析: 1. **主类LANChatV12**: - `LANChatV12`是程序的主入口点,通过`main`方法...

    基于Java的即时通讯软件

    再者,Java的多线程模型在即时通讯软件中起到关键作用。每个连接通常对应一个线程,以处理并发的用户请求,保证服务响应的及时性。线程池管理则能有效控制资源消耗,避免大量创建和销毁线程带来的性能开销。 此外,...

    1114.基于Socket的多线程TCP通讯系统.zip

    总结起来,基于Socket的多线程TCP通讯系统利用TCP的可靠性和Socket的网络编程接口,实现了高效的网络通信。通过多线程技术,服务器可以同时处理多个客户端的连接,保证了聊天系统的实时性和稳定性。在设计和实现这样...

    java socket开发即时通讯服务器

    总结,Java Socket在即时通讯服务器开发中扮演了基础的角色,涉及到网络编程、多线程、并发处理、协议设计等多个方面。理解并熟练运用这些技术,能够构建高效、稳定的即时通讯服务。而文件"ImWebServer"可能包含了...

Global site tag (gtag.js) - Google Analytics