在浏览了一下后,我无法找到问题的解决方案。
我的班级box.java
有自己的锁,其中包含方法methodA
和methodB
。
我有多个线程试图访问这些框对象。我想要的是线程尝试执行methodA
,并且在一定时间后,如果它无法获得框上的锁定,则执行methodB
。
有没有办法在Java中执行此操作?
提前致谢!
答案 0 :(得分:5)
java.util.concurrent.locks.Lock
接口有一个tryLock(long, TimeUnit)
方法就是这样做的。
请参阅http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html
据我所知,内置的监视器锁(synchronized
关键字使用的锁)无法实现这一点。
答案 1 :(得分:0)
您可以通过创建Notifier类来实现此目的。在我引用之前我做过类似的事情,我希望你能弄清楚你需要什么。
public class WaitNotifyTest {
public static void main(String[] args) {
Message msg = new Message("process it");
Waiter waiter = new Waiter(msg);
new Thread(waiter,"waiter 1 ").start();
Waiter waiter1 = new Waiter(msg);
new Thread(waiter1, "waiter 2 ").start();
Notifier notifier = new Notifier(msg);
new Thread(notifier, "notifier").start();
System.out.println("All the threads are started");
}
}
class Message {
private String msg;
public Message(String str){
this.msg=str;
}
public String getMsg() {
return msg;
}
public void setMsg(String str) {
this.msg=str;
}
}
class Notifier implements Runnable {
private Message msg;
public Notifier(Message msg) {
this.msg = msg;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name+" started");
try {
Thread.sleep(1000);
synchronized (msg) {
msg.setMsg(name+" Notify Tread 1");
msg.notify();
msg.setMsg(name+" Notify Tread 2");
msg.notify();
msg.setMsg(name+" Notify Tread 3");
msg.notify();
// msg.notifyAll();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Waiter implements Runnable{
private Message msg;
public Waiter(Message m){
this.msg=m;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
synchronized (msg) {
try{
System.out.println(name+" waiting to get notified at time:"+System.currentTimeMillis());
msg.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(name+" waiter thread got notified at time:"+System.currentTimeMillis());
//process the message now
System.out.println(name+" processed: "+msg.getMsg());
}
}
}
答案 2 :(得分:0)
有很多方法可以做到。
synchronized methods
来获取锁定和使用
thread.wait()
。{/ li>中的synchronized method
方法
semaphore
blocking queues
您可以获得以上所有here的教程。