可重入锁如何在这段Java代码中工作?

问题描述 投票:-3回答:1

我有三个类,一个是主类,一个是共享资源类,另一个是线程类。我在理解代码方面遇到了问题。如何理解此代码,如何分析代码以供将来参考? PrintingJob是一个线程,PrinterQueue是共享资源。我想看到传递对象的重要性。

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. 为什么我们要创建PrintingJob的对象
java multithreading reentrantlock
1个回答
0
投票

为什么我们在这里将printerqueue作为参数传递。

您的初始描述说明哪个是Thread,哪个是共享资源。因此,当必须完成实际工作时,您将为作为共享资源“printerqueue”的线程提供依赖性。

在您看到代码片段时,共享对象仅初始化一次,并且实质上与您要创建的10个线程共享,模拟10个不同的人/作业已在该打印机上启动打印

总之,您已为10个打印作业提供了1个“打印机”。

为什么我们要创建PrintingJob的对象

通过创建PrintingJob的对象,我们模拟了Threads执行的打印过程。

从技术上讲,您通过传递实现Runnable接口的类的实例来创建线程。

© www.soinside.com 2019 - 2024. All rights reserved.