2016-03-26 46 views
1

我試圖啓動2個線程,一個TCP和一個用於UDP第二個線程沒有達到

package com.main; 

import com.utility.HibernateUtil; 

public class ServerStarter { 

    public static void main(String[] args) { 
     System.out.print("Reach 1"); 
     Thread tcp = new Thread(new TcpServerStarter()); 
     tcp.start(); 
     System.out.print("Reach 2"); 
     Thread udp = new Thread(new UdpServerStarter()); 
     System.out.print("Reach 3"); 
     HibernateUtil.buildSessionFactory(); 
     System.out.print("Reach 4"); 
    } 

    public static class TcpServerStarter extends Thread{ 

     public TcpServerStarter(){ 
      new TcpServer(8500).run(); 
     } 
    } 

    public static class UdpServerStarter extends Thread{ 

     public UdpServerStarter(){ 
      new UdpServer(1000).run(); 
     } 
    } 
} 

只有「達到1」被打印出來。我讀過這可能會發生,如果我有單核心,但我有2個核心。

+1

你還沒有開始udp!添加udp.start(); –

回答

1

把代碼放入方法稱爲run()代替從構造(調用run()將阻止執行)

public static class TcpServerStarter extends Thread { 

    @Override 
    public void run() { 
     new TcpServer(8500).run(); 
    } 
} 

public static class UdpServerStarter extends Thread { 

    @Override 
    public void run() { 
     new UdpServer(1000).run(); 
    } 
} 

}

如果UdpServerTcpServer已經延伸Thread或實現Runnable調用它,你可以通過start()方法直接啓動它們,而不用創建包裝類。

2

您只能創建udp線程,但不能真正啓動它。加上:

udp.start(); 

其次,你直接從構造函數,而不是run方法啓動循環。更改爲:

public static class TcpServerStarter implements Runnable { 
    public void run(){ 
     new TcpServer(8500).run(); 
    } 
} 

對於UdpServerStarter也是類似的。

+0

試過了。沒有。 – Lundira

+0

@Lundira:還有一個問題,請參閱更新的答案。 –

2

當您致電new TcpServer(8500).run();在TcpServerStarter的構造

它開始在主線程中運行TCPSERVER。 我猜測它只是永遠服務,這就是爲什麼它沒有達到以下任何代碼。

還什麼茲比涅克說:你沒有啓動UDP線程。

1

沒有改變你的代碼太多,這個工程。我不確定TcpServer或UdpServer的具體實現是什麼樣的。所以現在就實施了一些虛擬的。我發現所有的打印輸出都按預期打印。

package network; 


class TcpServer implements Runnable{ 
    TcpServer(int port){ 

} 

@Override 
public void run() { 
    for (int i=0; i < 10; i++){ 
     System.out.println("Thread printing:" + i + "tid:" + Thread.currentThread().getId()); 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    }  
    } 
} 


class UdpServer implements Runnable{ 
    UdpServer(int port){ 

    } 

@Override 
public void run() { 
    for (int i=0; i < 10; i++){ 
     System.out.println("Thread printing:" + i + "tid:" + Thread.currentThread().getId()); 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    }  
} 

}

public class ServerStarter { 

public static void main(String[] args) { 
    System.out.print("Reach 1"); 
    Thread tcp = new Thread(new TcpServerStarter()); 
    tcp.start(); 
    System.out.print("Reach 2"); 
    Thread udp = new Thread(new UdpServerStarter()); 
    System.out.print("Reach 3"); 
    //HibernateUtil.buildSessionFactory(); 
    System.out.print("Reach 4"); 
} 

public static class TcpServerStarter extends Thread{ 

    public TcpServerStarter(){ 
     new TcpServer(8500).run(); 
    } 
} 

public static class UdpServerStarter extends Thread{ 

    public UdpServerStarter(){ 
     new UdpServer(1000).run(); 
    } 
} 

}

1

線程對象必須啓動使得相應Thread的執行可以開始。

我在你的代碼中看到下面的代碼

System.out.print("Reach 1"); 
Thread tcp = new Thread(new `TcpServerStarter`()); 

到現在爲止你還沒有叫tcp.start()。截至目前已創建的Thread.java一個新的對象,它是確定的,但主要的問題我覺得是的TcpServerStarter.java構造函數的代碼寫它,它阻止你前進的main method執行流程。

請參閱TcpServerStarter.java class是線程本身,因爲它延伸Thread.java。應該override run method在您的TcpServerStarter.java您應該將代碼從構造函數移動到run()方法。而不是創建`線程的對象。java如下修改代碼。

Thread tcp = new `TcpServerStarter`(); 

然後你需要調用你創建的Thread對象的start。

tcp.start() 

同樣,您需要修改代碼,包括使用UdpServerStarter

相關問題