2014-03-24 90 views
2

我在PHP的java多線程問題(同時運行時間)

在Java中套接字服務器和對方套接字客戶端我想通過多線程,但Java來處理來自PHP插座要求在Java在同一時間做一個接一個,等待完成第一個請求,並開始第二個,

這裏是我在Java代碼:

while (true) { 
    try { 
     clientSocket = serverSocket.accept(); 
     int i = 0; 
     for (i = 0; i < maxClientsCount; i++) { 
      if (threads[i] == null) { 
       (threads[i] = new clientThread(clientSocket, threads)).start(); 
       break; 
      } 
     } 
     if (i == maxClientsCount) { 
      PrintStream os = new PrintStream(clientSocket.getOutputStream()); 
      os.println("Server too busy. Try later."); 
      os.close(); 
      clientSocket.close(); 
     } 
    } catch (IOException e) { 
     System.out.println(e); 
    } 
} 


class clientThread extends Thread { 
    public clientThread(Socket clientSocket, clientThread[] threads) { 
     this.clientSocket = clientSocket; 
     this.threads = threads; 
     maxClientsCount = threads.length; 
    } 

    public void run() { 
     int maxClientsCount = this.maxClientsCount; 
     clientThread[] threads = this.threads; 
     try { 
      in = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); 
      URL aURL = new URL(RecivedURL); 
      // start out put 
      System.out.println("host = " + aURL.getHost()); 
      // end out put 

的粗線比如我輸出的,但我要開始多輸出在同一時間同時開始請求。JAvA等待在o中完成請求新時間我的代碼..

+1

首先,爲什麼不使用['ExecutorService'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html)而不是自己奇怪的代碼?我懷疑你的工作不夠長,不足以讓事情同時發生。 –

+0

您不應該擴展'Thread',只需實現'Runnable'並將其提供給正常的'Thread'類的構造函數。 –

+0

粗線在哪裏?你如何向Java提出請求? – Alvin

回答

1

我不明白你爲什麼要在這裏超過兩個線程。

如果你想逐個處理請求,你可能只產生一個只監聽請求的線程,並立即通過發送「處理」或「稍後再檢查」消息來響應它。 (稱之爲監聽器線程)

如果客戶端發送「處理」響應,則連接保持活動狀態,併產生另一個線程以實際處理的請求結果響應客戶端。 (稱這是一個處理線程)。

您可以讓偵聽器線程向隊列中的客戶端發送保持活動消息,或者您可以要求它在設定的時間段內使用請求進行檢查。您可以通過設置隊列來確定何時對發送「稍後再檢查」消息的客戶端進行響應,從而使偵聽器線程更加複雜。

從實現POV中,您的主線程可能是您的偵聽器線程,它可能會產生一個在處理請求時處理線程。

+0

感謝您的評論, – kiamoz

+0

reqouest是由PHP在套接字發送,我是新的Java和PHP是一個Web服務器,這是正常的發送一些過程在同一時間, – kiamoz

+1

終於這是最好的答案,但我用了一個隊列.. – kiamoz

1

我假設它的執行速度非常快,以至於最後一個請求在下一個請求被接受之前完成。

爲了調試嘗試添加:

try { 
    Thread.sleep(1000); 
} catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); 
} 

到運行方法,這樣就可以更容易檢查,如果它真的不是並行運行。