Java线程存在疑问

时间:2010-01-22 08:33:10

标签: java multithreading

我之前发布了一个关于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个端口,那么所需的输出不会被打印,如果我连接到两个端口,一个接一个,输出只在两个端口之后打印连接了。因此,这再次引发了我最初的困惑,即这两个线程是同时执行还是执行在这两个线程之间交替。

任何建议都会有很大的帮助。

干杯

5 个答案:

答案 0 :(得分:8)

在启动线程之前,您正在调用acceptaccept将阻止,直到建立连接,这就是您看到自己所做行为的原因。如果要监听多个端口,则需要[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);
    }


}

这(我猜)实现了并发线程。谢谢大家的建议。