当线程访问锁定的对象时,有什么方法可以运行一段代码?

public class Student implements Runnable {

private String name;
private Workshop w;

public Student(String name,Workshop workshop) {
    this.name = name;
    this.w=workshop;
}

@Override
public void run() {

    this.w.getReady();
    this.w.file(this.name);
    this.w.cut(this.name);
    this.w.punch(this.name); //Synchronized Method

    if(Thread.currentThread().getState()==Thread.State.BLOCKED)
        System.out.println(this.name+" is waiting in queue");

    System.out.println(this.name+" has finished and is going home");
}

}


这是对Workshop场景的模拟,其中每个学生都必须锉,切割和打孔金属工件。
由于打孔是逐个打孔的,所以我宣布它为同步的,因为每个学生(线程)都必须等待轮到打孔。
我想知道的是,是否有一些内置方法或编写一种方法的方法,该方法在线程被阻塞并等待内部锁被解锁时执行。





public void onBlock() {
    System.out.println(this.name+" is waiting in queue");
    ...
}

最佳答案

对于受synchronized保护的对象监视器,否,它要么成功锁定,要么无限期地等待锁定。

如果使用的是ReentrantLock或类似符号,则有更多选择:


您可以像调用对象监视器那样无限期地等待,只需调用lock
您可以通过使用超时值调用tryLock来等待有限的时间。
如果没有参数,则可以立即调用tryLock来返回锁定不可用的信息。

10-07 19:17
查看更多