2013-08-02 61 views
1

我有一個Java程序,當前在高峯時間會凍結。我正在尋找原因。現在,我的想法是,這是因爲某些代碼不是AJAX,所以在高峯時間從服務器請求JSON對象時(在高峯時間上網速度較慢),它會掛在那裏。但我不確定這不是AJAX。我不能在這裏粘貼所有的代碼,因爲它與公司的財產有關,所以我會寫一些代碼/僞代碼。該程序使用以下來執行請求。客戶端從服務器請求JSON時會凍結

URL url = new URL("http://www.xxxxxxxx.com/"); 
URLConnection conection = url.openConnection(); 
BufferedReader in = new BufferedReader(new InputStreamReader(conection .getInputStream())); 
String inputLine; 
String content = ""; 
while ((inputLine = in.readLine()) != null) { 
      content += inputLine; 
     } 
in.close(); 
json = new JSONObject(content); 

上面的代碼是程序的一些片段,我認爲它會導致凍結。我的問題是,這段代碼似乎沒有使用任何AJAX,它不是多線程,對吧?因此,當互聯網連接速度很慢時,它會掛在那裏(凍結)?我對此不是很有經驗。請幫忙。

如果您不認爲這是造成凍結的主要原因,那麼這種問題在一般情況下可能是最可能的原因。 預先感謝您。

編輯/更新:

  1. 我的計劃是,在客戶端上運行一個程序搖擺。此應用程序沒有 真實服務器端代碼。 URL地址是一個 第三方服務器,它提供程序 所需的某種數據。我沒有看到該程序使用任何線程。它基本上是核心Java,沒有使用任何線程,我看到,並且我對多線程不是很熟悉,所以我不確定。 (該程序不是由我編寫的,它是由一些前程序員編寫的)這就是爲什麼我正在考慮可能它沒有使用其他線程來運行此服務器請求時。

  2. 我的意思是凍結在高峯時段,當UI嘗試運行某些特定功能時,UI將凍結幾秒鐘。我寫的上面的代碼是這些函數的一些片段。 UI凍結一段時間後,其餘部分按預期工作。但是,在非高峯時段,它就像魅力一樣。

  3. 具體而言,BufferedReader in = new BufferedReader(new InputStreamReader(conection .getInputStream()));是我認爲導致問題的 。任何人都可以證實嗎?

+1

退房[併發在Swing(http://docs.oracle.com/javase/tutorial/uiswing/concurrency/),您是阻塞事件調度線程,阻止更新用戶界面和響應新事件 – MadProgrammer

+0

它會永久「凍結」嗎?或者它會「凍結」一段時間然後再回來? –

+0

@LeeMeador它凍結了一段時間,並按預期工作 – Joey

回答

1
  • 所有異步方法,如HTTP POST/GET,在單獨的線程中執行。用戶不希望看到你的應用程序在後臺執行什麼操作。

  • 另外,使用String作爲追加的不好的做法,如jlordo所說的,使用StringBuilderStringBuffer

    StringBuilder buff = new StringBuilder(); 而(!(inputLine = in.readLine())= NULL){

    if(!"".equals(line).trim){ 
         buff.append(line).append("\n"); 
        }   
    } 
    

    in.close();

  • 您可以將會話超時添加到會話中,以確保應用程序不會卡住。

[編輯]

關於問題的變化,我不認爲

的BufferedReader在新=的BufferedReader(新的InputStreamReader(連接如.getInputStream()));

這是你的問題。

你可以嘗試這樣做遵循流,但我仍然認爲關於單獨的線程中使用GUI線程

InputStream is = conection .getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 
String line = null; 
while ((line = br.readLine()) != null) { 
+0

事實上,@Joey,問題可能是你的程序在它應該是不多線程的時候。任何花費很長時間的操作都應該在其線程上運行,並且事件線程只應用於UI更新。 – chrylis

+0

@chrylis請參閱更新。這讓我的問題更加清楚。 – Joey

1

你可能想使用一個線程SwingWorker做調用服務器。這樣,當它很忙時,UI將不會凍結。

但是,請記住,在新數據到達之前,您不會在屏幕上看到新數據提供的結果更改。

Oracle SwingWorker JavaDocs

教程與example similar to yours

相關問題