2014-07-08 44 views
1

我是新來的多線程,我只是試圖通過使用線程打印14000大小字符串Arraylist實踐。我並沒有考慮效率,甚至對這個問題也沒有用處;我只想了解線程概念。你如何修復線程連接()卡住

我的輸出已經非常錯誤,我嘗試了各種同步和其他失敗的嘗試。我目前遇到了一個名爲join的工具,但是我的程序沒有退出並保持運行。我調試了代碼,程序只是停留在第一個線程連接上,我想不出任何理由或解決方案來解決問題。

我接近這個問題的方式是創建4個線程來分割打印任務。然後我會等到所有線程都完成並在關閉輸出文件之前使用連接權限。

public class Threadprinting implements Runnable{ 
private static List<String> list; 
private Thread T1,T2,T3,T4; 
public void printinput(List<String> store){ 
    list=new ArrayList<String>(store); 
    Threadprinting threadprinting=new Threadprinting(); 
    Threadprinting.generatethreads(); 
} 

public void generatethreads() { 
    T1=new Thread(this,"t1"); 
    T1.start(); 
    T2=new Thread(this,"t2"); 
    T2.start(); 
    T3=new Thread(this,"t3"); 
    T3.start(); 
    T4=new Thread(this,"t4"); 
    T4.start(); 
} 

public void run(){ 
    try {    
     PrintWriter out = new PrintWriter(new FileWriter("Output.txt")); 
     switch (Thread.currentThread().getName()) { 
      case "t1": 
       System.out.println("Thread "+ Thread.currentThread().getName() + " is running"); 
       for (int i = 0; i < list.size()/4; i++) { 
        out.println((list.get(i))); 
       } 
       break; 
      case "t2": 
       System.out.println("Thread "+ Thread.currentThread().getName() + " is running"); 
       for (int i = list.size()/4; i < list.size()/2; i++) { 
        out.println((list.get(i))); 
       } 
       break; 
      case "t3": 
       System.out.println("Thread "+Thread.currentThread().getName()+" is running"); 
       for (int i = list.size()/2; i < list.size()/4+list.size()/2; i++) { 
        out.println((list.get(i))); 
       } 
       break; 
      case "t4": 
       System.out.println("Thread "+Thread.currentThread().getName()+" is running"); 
       for (int i = list.size()/4+list.size()/2; i < list.size(); i++) { 
        out.println((list.get(i))); 
       } 
       break; 
      default: 
       System.out.println("filler"); 
       break; 
      } 
      jointhreads(); 
      out.close(); 
    } 
    catch(IOException e){ 
     System.out.println("problem came from here"); 
    } 
} 

具體來說:

private void jointhreads() { 
    try { 
     T1.join(); 
     T2.join(); 
     T3.join(); 
     T4.join(); 
    } catch (InterruptedException e) { 
     System.out.println("the joins failed"); 
    } 
} 

}

程序無法終止,並根據調試器在T1.join保持運行。

+0

你在T1中,你做了一個T1.join(),是你的問題嗎? – fluminis

回答

6

要調用jointhreads內你想加入線程,因此 T1是basicly等待T1(本身)終止,但將永遠不會發生。

你應該調用jointrheads在你的主線程,因此應用程序會等到所有工作線程將完成他們的工作

+0

非常感謝您的回覆。我理解這個問題,但我怎樣才能在主線程中加入線程,同時仍然在out.close()語句之前阻止所有線程。 –

+0

您正在創建4個differend作家(您的案例通常寫得不好),因此每個線程都可以關閉自己的流作家。 你應該在你的main中創建一個輸出,運行將使用該輸出的工作人員,然後關閉它在main中。另一件事是寫入流是不是線程安全的,你應該同步這個過程,但這是另一個問題。 – Antoniossss

+0

是的,玩了一段時間後,這正是我所做的。然而,我遇到了另一個問題,就是如何讓線程按照從1到4的順序執行打印。我嘗試設置優先級,但這不是一個可靠的解決方案。但是在做了一些研究之後,我認爲不可能讓線程遵循嚴格的順序。 –

1

T1.join(); 

指的聲明:「當前線程必須等到T1終止「。你的問題是當前線程是T1。

所以,這是一種我暫停我的跑步,直到我到達結尾。 (即死鎖)