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

Nsun 2002-06-04 05:45:27
1。做一个简单的下棋游戏,服务器端对每个连接请求生成一个线程处理,现在的问题是,其中的一个用户要找另一个客户下棋的时候,他们对应的服务器进程怎么才能通信呢?我觉得这样的通信应该是异步的,所以用wait和notify好像不行,而且一旦wait之后,进程就不能再读取客户端发送的信息了,那么java里有没有类似windows里sendmessage这样的函数或者实现异步通信的类?或者能否自定义事件(消息)?
2。java里有没有不阻塞的的io?
...全文
217 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
  • 打赏
  • 举报
回复
用管道。

搜帖子吧。

62,614

社区成员

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

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