私は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);
- なぜ我々はここに引数としてprinterqueueを渡しています。
- 私たちはここに引数としてprinterqueueを渡している、なぜ、なぜ私たちはPrintingJob
1.実際に引数として渡されるものは何ですか?コンストラクタはそれを期待します。 2. Runnableオブジェクトは、スレッドコンストラクタhttps://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.htmlにあります。コードに問題がありますか? – quintin