我之前发布了一个关于Java线程的查询。 (link text)
根据我收到的答案,我决定实施它们。所以我在具有2个CPU内核的机器上完成了这一点编码。代码如下
import java.net.*;
import java.io.*;
public class thready implements Runnable{
private Socket num;
public thready(Socket a) {
this.num=a;
}
public void run() {
try {
BufferedInputStream is = new BufferedInputStream(num.getInputStream());
System.out.println("Connected to port"+num);
} catch (IOException ex) {
//Logger.getLogger(thready.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void main(String [] args)
{
int port = 80;
int port1= 81;
//int count = 0;
try{
ServerSocket socket1 = new ServerSocket(port);
ServerSocket socket2 = new ServerSocket(port1);
while (true) {
Socket connection = socket1.accept();
Socket connection1 = socket2.accept();
Runnable runnable =new thready(connection);
Runnable run= new thready(connection1);
Thread t1=new Thread(runnable);
Thread t2=new Thread(run);
t1.start();
t2.start();
}
}
catch(Exception e)
{
} }}
现在我正在使用Hyperterminal测试这段代码并连接到端口890和端口81(我正在使用2个超级终端实例),据我所知,预期的行为应该是“连接到端口'端口号' “只要连接到任何端口(80或81),就应该打印出来。但是我从这段代码得到的输出是,如果我只连接到1个端口,那么所需的输出不会被打印,如果我连接到两个端口,一个接一个,输出只在两个端口之后打印连接了。因此,这再次引发了我最初的困惑,即这两个线程是同时执行还是执行在这两个线程之间交替。
任何建议都会有很大的帮助。
干杯
答案 0 :(得分:8)
在启动线程之前,您正在调用accept
。 accept
将阻止,直到建立连接,这就是您看到自己所做行为的原因。如果要监听多个端口,则需要[1]为每个ServerSocket
创建一个线程,然后在accept
返回时启动通信线程,或者在{1}}中逐个处理连接。线程在听。
[1]这仅适用于直接使用ServerSocket
的情况,您可能应该在学习时使用java.nio
。 {{1}}包及其子包包含用于多路复用非阻塞I / O的类,可用于例如侦听同一线程中的多个套接字。
答案 1 :(得分:5)
你在开始线程并阻止线程之前做了很多初始化。
我会将所有代码移动到runnable中。然后你也可以避免这些重复的变量名称,例如connection和connection1,让Thready拥有这些对象。
答案 2 :(得分:3)
代码
Socket connection = socket1.t();
Socket connection1 = socket2.accept();
使用Socket.accept这是阻止方法。请参阅javadoc:
侦听要建立的连接 这个插座并接受它。方法 阻止直到建立连接。
答案 3 :(得分:3)
你有这2行
Socket connection = socket1.accept();
Socket connection1 = socket2.accept();
现在,.accept()会阻塞,直到建立连接。
这意味着你的代码在上面的2.行上等待。在连接完成之前,你永远不会开始为'连接'启动线程。
答案 4 :(得分:0)
我根据建议稍微调整了一下代码并让它运行起来,我想。 这是修改后的构造函数和运行方法
public thready(int a) {
this.num=a;
}
public void run() {
try {
ServerSocket socket1 = new ServerSocket(num);
while(true){
Socket connection = socket1.accept();
BufferedInputStream is = new BufferedInputStream(connection.getInputStream());
System.out.println("Connected to port"+num);
}
} catch (IOException ex) {
//Logger.getLogger(thready.class.getName()).log(Level.SEVERE, null, ex);
}
}
这(我猜)实现了并发线程。谢谢大家的建议。