多线程可重入锁在这段Java代码中是如何工作的?
我有三个类,一个是主类,一个是共享资源类,另一个是线程类。我在理解代码方面遇到了问题。如何理解此代码,以及如何分析代码以供将来参考PrintingJob
是一个线程,PrinterQueue
是共享资源。我想看看传球的重要性
一级
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();
}
}
}
三级
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();
}
}
}
我的问题: 从第三班开始-
thread[i] = new Thread(new PrintingJob(printerQueue), "Thread " + i);
- 为什么我们在这里将printerqueue作为参数传递李>
- 为什么要创建PrintingJob的对象
# 1 楼答案
您最初的描述说明了哪个是线程,哪个是共享资源。因此,当实际工作必须完成时,您将为共享资源“printerqueue”提供线程的依赖关系
正如您看到的代码片段所示,共享对象只初始化了一次,本质上与您将要创建的10个线程共享,模拟10个不同的人/作业在该打印机上启动了打印
总之,您提供了1个“打印机”到10个打印作业
通过创建打印作业的对象,我们模拟了线程执行的打印过程
从技术上讲,通过传递实现Runnable接口的类的实例,您正在创建一个线程