2012-06-18 82 views
4

我有這個類在其中運行for循環10次。該類實現Runnable接口。現在在main()中創建2個線程。現在兩者都會運行循環直到10.但是我想檢查每個線程的循環次數。如果t1已經過了7,那麼讓它睡1秒,讓t2完成。但如何實現這一目標?請參閱代碼。我嘗試過,但看起來完全愚蠢。只是如何檢查一個線程的數據?如何在JAVA中減慢線程

class SimpleJob implements Runnable { 
    int i; 
    public void run(){ 
     for(i=0; i<10; i++){ 
      System.out.println(Thread.currentThread().getName()+" Running "); 
     }   
    } 

    public int getCount(){ 
     return i; 
    } 
} 
public class Threadings { 
    public static void main(String [] args){ 
     SimpleJob sj = new SimpleJob(); 
     Thread t1 = new Thread(sj); 
     Thread t2 = new Thread(sj); 

     t1.setName("T1"); 
     t2.setName("T2"); 

     t1.start(); 
     try{ 
      if(sj.getCount() > 8){ // I know this looks totally ridiculous, but then how to check variable i being incremented by each thread?? 
       System.out.println("Here"); 
       Thread.sleep(2000); 
      }    
     }catch(Exception e){ 
      System.out.println(e); 
     } 
     t2.start(); 
    }  
} 

請幫

+0

是不是有一種方法來確定哪個線程在給定時刻正在運行代碼?如果是這樣,那麼可以使用if語句來增加每個線程的值。 – BlackVegetable

+2

Sooo很多問題。爲什麼你甚至想要在多個線程中執行SAME作業?爲什麼你想要「減慢」一個計算。你試圖解決的問題還不清楚,也許如果你解釋你想達到的目標,你可以得到更好的答案。 – Jochen

+0

@blackVegetable:對不起,我是java中的新手。恐怕我不明白你的意思:( – Shades88

回答

-1

我加了synchronized塊,它可以由一個線程在同一時間內進入。兩個線程都調用並輸入並行方法。一條線將贏得比賽並取得鎖定。第一個線程離開塊後等待2秒鐘。在這個時候,第二個線程可以迭代循環。我認爲這種行爲是被通緝的。如果第二個線程也不能等待2秒鐘,則可以設置一些布爾標誌,即第一個線程完成該塊並在if語句中使用此標誌,這可以防止第二個線程的等待時間。

class SimpleJob implements Runnable { 
int i; 
public void run(){ 

    synchronized (this) { 
     for(i=0; i<8; i++){ 
      System.out.println(Thread.currentThread().getName()+" Running "); 
     } 
    } 

    try { 
     System.out.println("Here"); 
     Thread.sleep(2000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    for(i=0; i<2; i++){ 
     System.out.println(Thread.currentThread().getName()+" Running "); 
    } 
} 

public int getCount(){ 
    return i; 
} 
} 

public class Threadings { 
public static void main(String [] args){ 
    SimpleJob sj = new SimpleJob(); 
    Thread t1 = new Thread(sj); 
    Thread t2 = new Thread(sj); 

    t1.setName("T1"); 
    t2.setName("T2"); 

    t1.start(); 
    t2.start(); 
}  
} 
+0

+1向我展示的代碼..一個問題,條件是如果任何線程說t1超過7,那麼它應該在最後加入? – Shades88

+1

這兩個線程不加入。第二個線程必須等到第一個線程離開同步塊。同步塊使用對象(「t​​his」)作爲鎖。 –

+0

謝謝,那太神奇了。現在,我可以通過此代碼瞭解更多。再次感謝 – Shades88

7

你應該使用一些同步對象,而不是靠螺紋放緩下來。我強烈建議你看看java.util.concurrent包中的一個類。您可以使用此CountdownLatch - 線程1將等待它,線程2將執行倒計時並釋放鎖,並讓線程1繼續(發佈應在線程2代碼的末尾完成)。

+0

謝謝,我會研究它 – Shades88

0

如果目標是並行運行2周的Runnable(如線程),並等待他們兩個說完,就可以了,在日益複雜/電源的順序:

  1. 使用的Thread.join(如建議通過@Suraj德蘭不過他的回答似乎已被刪除)
  2. 使用的CountDownLatch(如也@zaske建議)
  3. 使用ExecutorService.invokeAll()

編輯ADDED

首先,我不明白什麼是神奇的「如果你在7等待其他」的邏輯是關於。但是,從你的主代碼中使用的Thread.join(),代碼看起來像

t1.start(); // Thread 1 starts running... 
t2.start(); // Thread 2 starts running... 

t1.join(); // wait for Thread 1 to finish 
t2.join(); // wait for Thread 2 to finish 

// from this point on Thread 1 and Thread 2 are completed... 
+0

好吧,我可以使用連接,但什麼時候?我希望當我在7或更高的任何線程時它應該在最後加入。我怎樣才能實現 – Shades88