多谢大家的回答。不过还有一些不明白 to hello_wyq(半瓶墨水):register是什么啊?我在jdk doc中找不到 to foulong(龙行天下):还是用消息吧。在大厅里设一组信箱 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 这要涉及什么类,能简单说一下怎么做吗? java里能够自己定义消息吗? to alphazhao(绿色咖啡):可是程序中事先不知道哪两个线程之间要有管道啊? to taolei(实在无聊):每个连接是要开两个线程的,一个发送,一个接收。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 可是这样的话,怎么在这两个线程间通信呢? 而且收发都各做各的,怎么控制通讯规程呢?我感到不知道怎么处理的情况是这样的: 两个服务线程各自在与客户端交互,但这个时候又要处理可能的相互之间的通讯,问题是服务进程在读对应的客户端输入的时候会阻塞,这个时候另一个服务进程就不能与它通讯了?这应该怎么处理呢?
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;
}
否则,如果一个线程,象你这情况,就是用了什么管道技术也是没有用的。非阻塞的IO倒是可以节省线程,甚至可以所有的连接都用一个线程。java的非阻塞IO没用过,不知道性能咋样。后者的编程方式是消息驱动的。如果所有连接都用一个线程,程序就比较容易写,可以省去资源同步的麻烦。对于消息响应比较快,连接不多的程序(响应时间*连接数=毫秒级),这样写比较好。一些大的服务程序,如:J2EE Application Server,都用前者,即阻塞IO,
java 的socket过去是没有非阻塞IO的,但即使有了,也不会都在一个线程里处理的。考虑线程过多而消耗的系统资源,有可能由原来的每个连接两个线程改成每个连接一个线程比较合理。
to hello_wyq(半瓶墨水):register是什么啊?我在jdk doc中找不到
to foulong(龙行天下):还是用消息吧。在大厅里设一组信箱
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这要涉及什么类,能简单说一下怎么做吗?
java里能够自己定义消息吗?
to alphazhao(绿色咖啡):可是程序中事先不知道哪两个线程之间要有管道啊?
to taolei(实在无聊):每个连接是要开两个线程的,一个发送,一个接收。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
可是这样的话,怎么在这两个线程间通信呢?
而且收发都各做各的,怎么控制通讯规程呢?我感到不知道怎么处理的情况是这样的:
两个服务线程各自在与客户端交互,但这个时候又要处理可能的相互之间的通讯,问题是服务进程在读对应的客户端输入的时候会阻塞,这个时候另一个服务进程就不能与它通讯了?这应该怎么处理呢?