线程之间的通讯,常见的是生产者,消费者模型。
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的网络编程API实现TCP通信,并通过多线程处理并发连接,这在构建例如QQ这样的聊天应用时是非常重要的技术。通过这种方式,服务端能够有效地管理大量并发的...
### Java多线程+Socket实现的漂亮QQ #### 技术要点分析 ##### 1. Java Swing Java Swing 是一个用于构建图形用户界面 (GUI) 的轻量级组件集,它为开发人员提供了丰富的功能来设计复杂的用户界面。在本项目中,...
总结来说,Java Socket的多线程通信是一个关键的网络编程概念,它使得服务器能够同时处理多个客户端请求,提高了服务的响应速度和并发能力。结合特定的工具如XtreamXml,可以进一步优化数据的传输和处理效率。
Java 线程知识点总结 Java 线程是一种轻量级的进程...本文总结了 Java 线程的基本概念、创建线程的方式、多线程的运行特性、五种线程状态、同步机制和线程间通讯等知识点,为读者提供了一个系统的 Java 线程知识框架。
总结来说,这个项目展示了如何使用zeromq的jeromq库在Java中实现多线程的经销商-路由器模式。它提供了一个基础的架构,可以扩展到更复杂的分布式系统,处理高并发请求,并实现高效的消息传递。通过理解zeromq的通信...
提供的"同步异步多线程SOCKET通讯.txt"文件可能包含实际的示例代码,展示了如何在Python、Java或C++等语言中实现同步和异步多线程Socket通信。这些代码可能包括创建Server端的Socket监听,创建并管理线程池,处理...
小白学习java多线程的写的文档总结。线程通讯,线程状态,线程安全,线程池,以及多线程的使用方法啊
│ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细介绍与知识点总结.mp4 │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致...
在Java中,`synchronized`关键字用于控制多线程对共享资源的访问,确保同一时间只有一个线程可以执行特定代码块。这主要涉及到Java内存模型(JMM)中的锁机制,包括监视器锁(Monitor)和互斥量,以及happens-before...
在Java编程语言中,多线程是并发执行的程序组件,它们可以共享资源并相互协作完成复杂的任务。在多线程环境下,线程间的通信至关重要,以确保数据的一致性和程序的正确性。本节主要讲解如何使用`wait()`和`notify()`...
总结,Qt与Java之间的Socket通信涉及了网络编程、JSON序列化和反序列化、多线程处理(特别是在Java中处理并发连接时)、以及错误处理等多个技术点。理解并熟练掌握这些知识点,可以构建可靠的跨平台通信系统。
【总结】基于Java的即时通讯系统设计与实现结合了Java语言的优势,能够构建稳定、高效的即时通讯平台,满足用户多样化的需求。从娱乐、社交到商务应用,Java的即时通讯系统在现代社会中扮演着日益重要的角色。
本文将深入探讨`ServerSocket`在单线程和多线程环境下的应用,以及它们各自的特点和适用场景。 首先,我们来看`ServerSocket`的单线程例子。在单线程模式下,服务器只有一个线程来处理所有客户端的连接请求。这通常...
在Java中实现即时通讯,通常涉及网络编程,包括TCP或UDP协议的使用,以及多线程技术来处理并发连接。以下是对给定源代码的详细解析: 1. **主类LANChatV12**: - `LANChatV12`是程序的主入口点,通过`main`方法...
再者,Java的多线程模型在即时通讯软件中起到关键作用。每个连接通常对应一个线程,以处理并发的用户请求,保证服务响应的及时性。线程池管理则能有效控制资源消耗,避免大量创建和销毁线程带来的性能开销。 此外,...
总结起来,基于Socket的多线程TCP通讯系统利用TCP的可靠性和Socket的网络编程接口,实现了高效的网络通信。通过多线程技术,服务器可以同时处理多个客户端的连接,保证了聊天系统的实时性和稳定性。在设计和实现这样...
总结,Java Socket在即时通讯服务器开发中扮演了基础的角色,涉及到网络编程、多线程、并发处理、协议设计等多个方面。理解并熟练运用这些技术,能够构建高效、稳定的即时通讯服务。而文件"ImWebServer"可能包含了...