2011-12-09 13 views
0

私はJavaのMTで簡単な問題があります。私はコンソールにアクセスを同期させるのが嫌です。例: System.outの最初のスレッド "Number one" Thread2 printl( "Number two")。私は、このスレッドを順次バッファリングせずにコンソールに数値を書き込むように同期させたいと思っています。これはどうですか?スレッドとコンソールを共有

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

交替するには2つのスレッドが必要ですか?または、任意の数のスレッドが必要ですか?この例は2つです。 – corsiKa

答えて

2

私が恐れているのはむしろ無駄な質問です。なぜなら、シーケンシャルな順序付けスレッドはむしろ役に立たないが、ああ、ここでの解決策の1つです。

スレッド0は

がうまくあなたがパターンを取得数1、N + 1を書くべき

スレッド1数0、N、2N、3N、...、2N + 1、3N + 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

関連する問題