当线程访问锁定的对象时,有什么方法可以运行一段代码?
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
来返回锁定不可用的信息。