2016-07-27 8 views
0

2つのスレッドを持つマルチスレッドプログラムを作成しようとしています。最初のコマンドは "新しい"コマンドのプロンプトが表示された後にランダムアクセスファイルを更新し、2番目のコマンドは "new"または "end"コマンドを受け付けて最初のスレッドに送信します。私は、セマフォーによって制御されるキューを使用したいと思っていました。私はちょうど他のスレッドを関連付ける方法を知らない。一方のスレッドはユーザーコマンドから文字列を生成してキューに挿入し、もう一方のスレッドは文字列をキューから取り出してダイレクトアクセスファイルに書き込みます。スレッドの開始方法を教えてもらえますか?マルチスレッドプログラムの2番目のスレッドの作成に問題があります

package multi_threaded_producer_consumer; 
import java.util.concurrent.Semaphore; 

public class MTQueue { 

    private Semaphore sem = new Semaphore(1); 
    private java.util.Queue<String> statQ; 

    public static void main(String[] args) { 

    } 

    public MTQueue(){ 
     statQ = new java.util.LinkedList<String>(); 
    } 

    public void MTPut(String qe) { 
     try { 
      sem.acquire(); 
      statQ.offer(qe); 
     } catch(InterruptedException ex) { 

     } finally { 
      sem.release(); 
     } 
    } 

    public String MTGet() { 
     String retVal = new String(); 
     try { 
      sem.acquire(); 
      retVal = statQ.poll(); 
     } catch(InterruptedException ex) { 

     } finally { 
      sem.release(); 
     } 
     return retVal; 
    } 

} 
+1

あなたは文字通りどのようにJavaでスレッドを書くことを求めている:あなたはそれをキャッチすると、あなたは常に、少なくとも現在のスレッドを中断する必要がありますか?新しいスレッド(myRunnable).start()です。ここで、myRunnableは、スレッドが実行したいものを実行する実行機能を持つクラスです。他に何かを求めているなら、もっと明確にしよう。 –

+0

@GabeSechan私はそれを別のクラスに入れたり、すでに書いたものの中に追加しますか?これらは多分疑問な質問ですが、私は本当にマルチスレッドの使用の理由を理解していません。 – Chief

+0

'InterruptedException'(または他の例外)を飲み込むことは悪い癖です。あなたのプログラムが中断されることを期待しておらず、中断した場合に何が起こっても気にしない場合は、 'run runtimeException(ex);をスローするだけです。 –

答えて

0

誰でもスレッドが開始する方法でチャイムを助けることができますか?

確かに。基本スレッドでは、スレッドを実行するためにRunnableクラスを作成する必要があります。ここにはgood tutorial on the subjectがあります。ここで

は、あなたの生産のためのコードの例です:いいえためにあなたのコードに関する他のコメントの

// queue must be final for the Runnable classes to use it 
final MTQUeue queue = new MTQueue(); 
... 
// create a new producer thread and start it 
new Thread(new Runnable() { 
    public void run() { 
     queue.MTPut("new"); 
     queue.MTPut("end"); 
    } 
}).start(); 
... 
// create a new consumer thread and start it 
new Thread(new Runnable() { 
    public void run() { 
     System.out.println("Got command: " + queue.MTGet()); 
     System.out.println("Got command: " + queue.MTGet()); 
    } 
}).start(); 

カップル:

  • 私は、これは学術的なプロジェクトであると仮定します。それ以外の場合はLinkedBlockingQueueをご覧ください。
  • MTPut()およびMTGet()のメソッドは、おそらくちょうどput()get()です。 MTはクラス名にあります。
  • statQ.offer(...)は、おそらくstatQ.add(...)です。 offer()メソッドは、限られたキューに対してのみ使用されます。 LinkedQueueはそれらの1つではありません。
  • String retVal = new String();new String()は不要で削除できます。実際にreturn statQ.poll();を実行し、retValを持っていない可能性があります。
  • キャッチInterruptedException exそれを無視することは、実際には悪いことです。

    } catch(InterruptedException ex) { 
        // always a good pattern to re-interrupt the current thread 
        Thread.currentThread().interrupt(); 
        // since the thread was interrupted we should return or something 
        return; 
    
関連する問題