2015-05-23 43 views
-2

我對線程有一些奇怪的(或至少是怪異的)問題。我有主這樣線程不能作爲線程

public class Main { 
public static void main(String[] args) { 
    int port = 5555; 
    String server = "127.0.0.1"; 
    int x=20, y=20, squareSize = 25; 


    Thread connectionManager = new ConnectionManager(server, port, x, y); 
    connectionManager.run(); 
    System.out.print("BUM"); 

其中的ConnectionManager是

public class ConnectionManager extends Thread{ 
private String server; 
private int port; 
private int x; 
private int y; //dlugosc mapy 

private Socket socket; 
private int[][] currentMap; 
File file; 
PrintWriter printWriter; 

public ConnectionManager(String server, int port, int x, int y) { 
    this.server = server; 
    this.port = port; 
    this.x = x; 
    this.y = y; 
    currentMap = new int[x][y]; 

} 

public int[][] getCurrentMap() { 
    return currentMap; 
} 

@Override 
public void run() { 

    try { 
     socket = new Socket(server, port); 
     DataInputStream is = new DataInputStream(socket.getInputStream()); 

     while (true) { 
      if (is.readBoolean() == true) 
      { 

       for (int i = 0; i < x; i++) { 
        for (int j = 0; j < y; j++) { 
         currentMap[i][j] = is.readInt(); 
        } 
       } 
      } 

     } 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
} 

但是,即使我的ConnectionManager是一個線程,除非連接從關閉它不會去到的System.out.println服務器。我已經考慮了一段時間了,我無法弄清楚爲什麼它不起作用。

不要以爲事情,但主的ConnectionManager在其他的Maven模塊(主要是其具有的ConnectionManager的模塊依賴的GUI模塊)

我將不勝感激的任何建議。

+2

我不能相信人們正在upvoting經典開始vs反覆運行錯誤... –

回答

2

調用connectionManager.run()不生成線程。它僅僅調用run並等待完成以達到System.out一行。

要在單獨的線程中運行run方法,您需要撥打connectionManager.start()。見https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#start()

+0

謝謝!有趣的是,在一個服務器項目中,我做了正確的運行(使用start()方法),但出於某種原因,我做了這樣一個簡單的錯誤。 –

5

如果您直接運行run()方法,那麼您實際上並沒有在新線程中運行它。

要真正開始執行任務的線程,您必須運行其start()方法。在引擎蓋下,它創建一個本地線程並將控制權交給它,而另一個線程則運行run()方法。

+0

祝賀10k :) – Leeor

+0

謝謝!有趣的是,在一個服務器項目中,我做了正確的運行(使用start()方法),但出於某種原因,我做了這樣一個簡單的錯誤。 –