2010-01-22 127 views
3

我以前发布了一个关于Java线程的查询。 (link textJava线程怀疑

根据我收到的答案,我决定实施它们。所以我在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) 
    { 

    } }} 

现在即时通讯测试这块使用超级终端代码和上午连接到两个端口890和端口81(正在使用超级终端2个实例)和我理解预期的行为应该是只要连接到任何端口(80或81),就应该打印“连接到端口”端口号“”。但我从这段代码得到的输出是,如果我只连接到1端口,那么所需的输出不会被打印,如果我连接到两个端口,一个接一个,输出仅在两个端口后打印连接。所以这又让我对最初的困惑是这两个线程是并发执行还是执行在这两个线程之间交替。

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

干杯

+0

+1不读取Java API文档:) – willcodejavaforfood 2010-01-22 11:47:34

回答

8

你在开始线程之前调用acceptaccept将阻塞,直到建立连接,这就是为什么你看到你所做的行为。如果您想在多个端口上侦听,您需要[1]为每个ServerSocket创建一个线程,然后当accept在执行侦听的线程中逐个返回或处理连接时启动通信线程。

[1]仅当您直接使用ServerSocket时才适用,您可能应该在学习时使用它。 java.nio包及其子包中包含用于复用非阻塞I/O的类,可用于例如在同一线程中监听多个套接字。

3

代码

Socket connection = socket1.t(); 
Socket connection1 = socket2.accept(); 

使用Socket.accept其为阻断方法。请参阅javadoc:

侦听与此套接字连接并接受它。方法 直到建立连接。

3

你有这两条线

Socket connection = socket1.accept(); 
Socket connection1 = socket2.accept(); 

现在。接受()块,直到建立连接。

这意味着当您的代码在上面的第2行上等待时。在连接完成之前,你永远都不会开始为“连接”启动线程。

5

在启动线程并阻止之前,您正在进行大量初始化。

我会将所有代码移动到可运行模式中。那么你也可以避免这些重复的变量名称,例如connection和connection1,让这些对象拥有Thready。

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); 
    } 


} 

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

+0

我建议您将其编辑到问题文本中并接受答案。 – blank 2010-01-22 09:06:47