2011-12-09 57 views
0

我在java中遇到了MT的簡單問題。我很想同步acces到控制檯。例如: 第一個線程寫入System.out「Number 1」Thread2 printl(「Number 2」)。我很想同步這個線程在控制檯中順序編寫數字而不用緩衝。這是怎麼回事?控制檯與線程共享

Thread one 
Thread two 
Thread one 
Thread two 
... 

//代碼

package com.example; 

public class MyThread implements Runnable{ 


@Override 
synchronized public void run(){ 
    while(true){ 
     System.out.println("Thread first"); 

    } 
} 

}

//

package com.example; 

public class MyThread2 implements Runnable { 


@Override 
synchronized public void run() { 
    // TODO Auto-generated method stub 
    System.out.println(""); 

} 

} 

//

package com.example; 

import java.util.concurrent.Semaphore; 

public class Main { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

Thread th1= new Thread(new MyThread()); 
Thread th2= new Thread(new MyThread2()); 

th2.setPriority(Thread.MAX_PRIORITY); 
th1.start(); 
th2.start(); 
    } 

} 
+0

如果您在使用現有代碼時遇到問題,請發佈一些代碼。你試過什麼了?另外,我不確定爲什麼除了[標籤:家庭作業]或某種學習練習之外還想這樣做。如果這是作業,請將該標籤添加到問題中,以便我們知道只是提示。 –

+1

爲了順序寫入,爲什麼要使用線程?這只是一個利益問題嗎? –

+0

你需要兩個線程交替嗎?或者你需要任意數量的線程,這個例子恰好是兩個? – corsiKa

回答

2

嗯,這是一個相當無用的問題,我擔心,因爲如果我們想要一個順序排序的線程是相當無用的,但哦,這裏有一個解決方案:假設我們有N個線程。

線程0應該寫數字0,N,2N,3N,..

線程1應該寫數字1,N + 1,2N + 1,N + 1

你可能得到這樣的格局。這個怎麼做?很簡單,我們基本上只需要一種等待輪到我們寫信的方法。真正的簡單解決方案與簡單的靜態對象:

private static volatile int globalVal = 0; 
private static Object lock = new Object(); 

public void writeInt(int val) { 
    synchronized(lock) { 
     while (globalVal != val) { 
      try { 
       lock.wait(); 
      } 
      catch(InterruptedException e) { 
      } 
     } 
     System.out.println(val); 
     globalVal++; 
     lock.notifyAll(); 
    } 
} 

線程本身的邏輯是留給讀者的練習。

0

我們e Queue<String>並將String添加到隊列中。然後有一個專用線程從隊列中取出並寫入控制檯。這將根據線程的隊列訪問創建一個FIFO排序。

如果你不想使用隊列,你應該像一個令牌管理器那樣切換被阻塞的線程。每個參與線程的Exchanger<V>將是一個很好的起點。

+0

這將不會確保順序號碼被寫入控制檯。練習是線程之間的嚴格交替,每個線程都在等待打印之間的另一個線程。 –

+0

取決於隊列實現,但在2個線程的情況下,這可以通過使用'SynchronousQueue ' –

+0

來完成。一個長度爲1的阻塞隊列可以解決這個問題,對吧? – user949300