2017-12-27 18 views
-3

私は3つのクラスを1つはメインクラス、1つは共有リソースクラス、その他はスレッドクラスです。私はコードを理解する上で問題に直面しています。このコードを理解するにはどうすればよいのですか? PrintingJobはスレッドであり、PrinterQueueは共有リソースです。私はオブジェクトを渡すことの重要性を見てみたいです。このJavaコードではリエントラント・ロックはどのように機能しますか?

クラス1

package com.lock.demo; 
    //creating a Thread by implementing the Runnable interface 
    class PrintingJob implements Runnable 
    { 
     private PrinterQueue printerQueue; 
     public PrintingJob(PrinterQueue printerQueue) 
     { 
      this.printerQueue = printerQueue; 
     } 

     @Override 
     public void run() 
     { 
      System.out.printf("%s: Going to print a document\n", Thread.currentThread().getName()); 
      printerQueue.printJob(new Object()); 
     } 
    } 

クラス2

package com.lock.demo; 
    //acts as a shared resource 
    import java.util.Date; 
    import java.util.concurrent.locks.Lock; 
    import java.util.concurrent.locks.ReentrantLock; 
    class PrinterQueue 
    { 
     private final Lock queueLock = new ReentrantLock(); 
     public void printJob(Object document) 
     { 
      //Lock aquired 
      queueLock.lock(); 
      //critical section 
      try 
      { 
      Long duration = (long) (Math.random() * 10000); 
      System.out.println(Thread.currentThread().getName() + ": PrintQueue: Printing a Job during " + (duration/1000) + " seconds :: Time - " + new Date()); 
      Thread.sleep(duration); 
      } catch (InterruptedException e) 
      { 
      e.printStackTrace(); 
      } finally 
      { 
      System.out.printf("%s: The document has been printed\n", Thread.currentThread().getName()); 
      //Lock Released 
      queueLock.unlock(); 
      } 
     } 
    } 

クラス3

package com.lock.demo; 
    //main class 
    public class LockExample 
    { 
     public static void main(String[] args) 
     { 
      PrinterQueue printerQueue = new PrinterQueue(); 
      Thread thread[] = new Thread[10]; 
      for (int i = 0; i < 10; i++) 
      { 
      thread[i] = new Thread(new PrintingJob(printerQueue), "Thread " + i); 
      } 
      for (int i = 0; i < 10; i++) 
      { 
      thread[i].start(); 
      } 
     } 
    } 

私の質問: ラインでクラス3から -

thread[i] = new Thread(new PrintingJob(printerQueue), "Thread " + i); 
  1. なぜ我々はここに引数としてprinterqueueを渡しています。
  2. 私たちはここに引数としてprinterqueueを渡している、なぜ、なぜ私たちはPrintingJob
+0

1.実際に引数として渡されるものは何ですか?コンストラクタはそれを期待します。 2. Runnableオブジェクトは、スレッドコンストラクタhttps://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.htmlにあります。コードに問題がありますか? – quintin

答えて

0

のオブジェクトを作成しています。

あなたの初期の説明には、スレッドと共有リソースが記載されています。実際の作業を行う必要がある場合つまり、あなたの共有リソース「printerqueue」であるスレッドに対して

を依存関係を提供しているあなたは、コードスニペットを見るとわかるように、共有オブジェクトは一度だけ初期化され、本質的にと共有されていますあなたが作成しようとしているスレッド10個をシミュレートして、10人の異なる人物/ジョブがその印刷を開始しました。プリンタ

要約すると、10の印刷ジョブに1つの「プリンタ」が提供されています。

なぜ我々は印刷プロセスをシミュレートしているPrintingJobのオブジェクトを作成することによりPrintingJob

のオブジェクトを作成しているがスレッドによって実行されます。

技術的には、あなたはRunnableをインタフェースを実装するクラスのインスタンスを渡すことによってスレッドを作成しています。

関連する問題