2010-01-22 125 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