急问:java里的线程之间怎么通信?

Nsun 2002-06-04 05:45:27
1。做一个简单的下棋游戏,服务器端对每个连接请求生成一个线程处理,现在的问题是,其中的一个用户要找另一个客户下棋的时候,他们对应的服务器进程怎么才能通信呢?我觉得这样的通信应该是异步的,所以用wait和notify好像不行,而且一旦wait之后,进程就不能再读取客户端发送的信息了,那么java里有没有类似windows里sendmessage这样的函数或者实现异步通信的类?或者能否自定义事件(消息)?
2。java里有没有不阻塞的的io?
...全文
256 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
taolei 2002-06-05
  • 打赏
  • 举报
回复
针对一个简单的下棋程序,每个连接只需要建立一个接收线程就可以了,需要发送数据时,可以在任何线程里向任何连接发送数据就行了。这样做潜在的问题是如果发送数据时发生了阻塞,那么这个线程就要停下来等待。但对于简单的下棋程序这个问题可以忽略。至于所有客户连接的所有数据,都通过共享的方式读写就可以了。

如果你用到了wait/notify的方式,当前线程就必须停下来,所以用到wait/notify的线程应该是独立的提供单一服务的线程。即:它wait的时候就应该是它无事可做的时候。
Nsun 2002-06-04
  • 打赏
  • 举报
回复
dimstar(塞浦路斯的幽灵) :握手握手,再完不成就要被pk了
dimstar 2002-06-04
  • 打赏
  • 举报
回复
呵呵!
这是你的作业吧,跟我一样。
我也在想呢!
Nsun 2002-06-04
  • 打赏
  • 举报
回复
高手帮帮忙啊!实在是急
Nsun 2002-06-04
  • 打赏
  • 举报
回复
管道通讯也是阻塞的。
Nsun 2002-06-04
  • 打赏
  • 举报
回复
多谢大家的回答。不过还有一些不明白
to hello_wyq(半瓶墨水):register是什么啊?我在jdk doc中找不到
to foulong(龙行天下):还是用消息吧。在大厅里设一组信箱
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这要涉及什么类,能简单说一下怎么做吗?
java里能够自己定义消息吗?
to alphazhao(绿色咖啡):可是程序中事先不知道哪两个线程之间要有管道啊?
to taolei(实在无聊):每个连接是要开两个线程的,一个发送,一个接收。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
可是这样的话,怎么在这两个线程间通信呢?
而且收发都各做各的,怎么控制通讯规程呢?

我感到不知道怎么处理的情况是这样的:
两个服务线程各自在与客户端交互,但这个时候又要处理可能的相互之间的通讯,问题是服务进程在读对应的客户端输入的时候会阻塞,这个时候另一个服务进程就不能与它通讯了?这应该怎么处理呢?



taolei 2002-06-04
  • 打赏
  • 举报
回复
一般情况下,每个连接是要开两个线程的,一个发送,一个接收。
否则,如果一个线程,象你这情况,就是用了什么管道技术也是没有用的。

非阻塞的IO倒是可以节省线程,甚至可以所有的连接都用一个线程。java的非阻塞IO没用过,不知道性能咋样。

后者的编程方式是消息驱动的。如果所有连接都用一个线程,程序就比较容易写,可以省去资源同步的麻烦。对于消息响应比较快,连接不多的程序(响应时间*连接数=毫秒级),这样写比较好。

一些大的服务程序,如:J2EE Application Server,都用前者,即阻塞IO,
java 的socket过去是没有非阻塞IO的,但即使有了,也不会都在一个线程里处理的。考虑线程过多而消耗的系统资源,有可能由原来的每个连接两个线程改成每个连接一个线程比较合理。


foulong 2002-06-04
  • 打赏
  • 举报
回复
不阻塞的IO是有的,jdk1.4新增的,java.nio.*;
foulong 2002-06-04
  • 打赏
  • 举报
回复
楼上的变星星了?可喜可贺啊。我可是只剩一三角了。
alphazhao 2002-06-04
  • 打赏
  • 举报
回复
给你一个管道通信的例子:
core in java2
即JAVA2核心技术第2卷55页管道通信的例子

/**
* @version 1.20 1999-04-23
* @author Cay Horstmann
*/

import java.util.*;
import java.io.*;

public class PipeTest
{ public static void main(String args[])
{ try
{ /* set up pipes */
PipedOutputStream pout1 = new PipedOutputStream();
PipedInputStream pin1 = new PipedInputStream(pout1);

PipedOutputStream pout2 = new PipedOutputStream();
PipedInputStream pin2 = new PipedInputStream(pout2);

/* construct threads */

Producer prod = new Producer(pout1);
Filter filt = new Filter(pin1, pout2);
Consumer cons = new Consumer(pin2);

/* start threads */

prod.start();
filt.start();
cons.start();
}
catch (IOException e){}
}
}

class Producer extends Thread
{ public Producer(OutputStream os)
{ out = new DataOutputStream(os);
}

public void run()
{ while (true)
{ try
{ double num = rand.nextDouble();
out.writeDouble(num);
out.flush();
sleep(Math.abs(rand.nextInt() % 1000));
}
catch(Exception e)
{ System.out.println("Error: " + e);
}
}
}

private DataOutputStream out;
private Random rand = new Random();
}

class Filter extends Thread
{ public Filter(InputStream is, OutputStream os)
{ in = new DataInputStream(is);
out = new DataOutputStream(os);
}

public void run()
{ for (;;)
{ try
{ double x = in.readDouble();
total += x;
count++;
if (count != 0) out.writeDouble(total / count);
}
catch(IOException e)
{ System.out.println("Error: " + e);
}
}
}

private DataInputStream in;
private DataOutputStream out;
private double total = 0;
private int count = 0;
}

class Consumer extends Thread
{ public Consumer(InputStream is)
{ in = new DataInputStream(is);
}

public void run()
{ for(;;)
{ try
{ double avg = in.readDouble();
if (Math.abs(avg - old_avg) > 0.01)
{ System.out.println("Current average is " + avg);
old_avg = avg;
}
}
catch(IOException e)
{ System.out.println("Error: " + e);
}
}
}

private double old_avg = 0;
private DataInputStream in;
}
foulong 2002-06-04
  • 打赏
  • 举报
回复
呵呵,还是用消息吧。在大厅里设一组信箱,每个socket一个箱子。
你总得知道你对家的信箱号吧?然后往里头塞消息就是了,而
你对家的socket每做一次while循环,就检查自己的信箱,消息不就
传递过去了么。
hello_wyq 2002-06-04
  • 打赏
  • 举报
回复
用管道,或者register
Nsun 2002-06-04
  • 打赏
  • 举报
回复
问题是,管道要确定是哪两个线程,
而下棋的时候并不知道哪个客户端要跟哪个客户端连接下棋
hccpro 2002-06-04
  • 打赏
  • 举报
回复
java.io.PipedReader
hccpro 2002-06-04
  • 打赏
  • 举报
回复
用管道。

搜帖子吧。
内容概要:本文系统研究了构网型变流器的正负序阻抗解耦特性及其在弱电网环境下的稳定性表现,重点依托Matlab/Simulink仿真平台,构建了详细的阻抗数学模型,设计了解耦控制策略,并采用小信号扫频法进行频域辨识与稳定性验证。研究深入探讨了构网型变流器与传统跟网型逆变器在正负序阻抗特性上的本质差异,结合虚拟同步发电机(VSG)等先进控制技术,分析其在抑制宽频带振荡、削弱锁相环动态耦合等方面的优越性。文中不仅提供了完整的仿真模型与MATLAB代码实现,还整合了光伏、风电、储能、微电网等多类新能源系统的阻抗建模与稳定性分析资源,形成了一套面向新型电力系统稳定性的综合性技术资料体系,具有较强的科研复现与工程参考价值。; 适合人群:面向具备电力电子、电力系统自动化、新能源并网等专业背景的研究生、高校教师及工程技术人员,特别适用于从事阻抗建模、小干扰稳定性分析、宽频振荡机理研究以及撰写高水平学术论文的科研工作者。; 使用场景及目标:①掌握构网型变流器正负序阻抗建模与扫频辨识的仿真方法;②深入理解VSG等构网型控制在弱电网中提升稳定性的内在机理;③复现顶刊论文中的阻抗分析流程与稳定性判据应用;④利用提供的成熟模型与代码加速科研进程,支撑课题研究与学术成果产出。; 阅读建议:建议结合文中提供的Simulink模型与MATLAB代码,按照“理论建模—仿真搭建—扫频激励—频响提取—Nyquist判据分析”的完整流程进行实践操作,重点关注扫频信号的注入方式、频率范围设置及阻抗曲线的物理意义解读,并参考博士论文复现案例深化对复杂动态耦合问题的理解。

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧