2016-03-26 10 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つを開始しようとしていますのみ「1に達する」と印字されています。私は、私は2つのコアを持っているが、私は単一のコアを持っている場合、これが発生する可能性があることを読んだ。

+1

あなたはudpを開始していません! udp.start()を追加します。 –

答えて

1

代わりコンストラクタUdpServerTcpServer既にThreadを拡張またはRunnableを実装する場合

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

}

(実行をブロックするrun()を呼び出す)からそれを呼び出すrun()と呼ばれる方法にコードを入れてラッパークラスを作成しないでstart()メソッドで直接開始することができます。

2

udpスレッドのみ作成しますが、実際には起動しません。これを追加する:

udp.start(); 

第2に、メソッドを実行する代わりにコンストラクタから直接ループを開始します。変更:

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

同様にUdpServerStarter。

+0

試しました。何もない。 – Lundira

+0

@Lundira:別の問題がありました。更新された回答をご覧ください。 –

2

new TcpServer(8500).run()に電話すると、 TcpServerStarterのコンストラクタで

MAINスレッドでtcpServerの実行を開始します。 私はそれがちょうど永遠に役立つと推測しています。これが次のコードに到達しない理由です。

また、Zbynek氏によると、あなたは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の実行を開始することができるように、スレッドオブジェクトが起動されなければなりません。

私は今あなたがまだtcp.start()を呼び出していないティルコード

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

以下のコード内で参照してください。今まであなたはThread.javaの新しいオブジェクトを作成しましたが、それはOKですが、私が感じる主な問題は、TcpServerStarter.javaのコンストラクタで、コードが書かれているため、先にmain methodの実行の流れが妨げられています。

TcpServerStarter.javaを参照してください。クラスは、を拡張するスレッドです。あなたのTcpServerStarter.javaoverride run methodする必要があります。コードをコンストラクタからrun()メソッドに移動する必要があります。スレッドのオブジェクトを作成する代わりに。java以下のコードを修正してください。

Thread tcp = new `TcpServerStarter`(); 

次に、作成したスレッドオブジェクトでstartを呼び出す必要があります。

tcp.start() 

UdpServerStarterのコードも同様に変更する必要があります。