Java多线程 - 尝试获取锁定,直到经过一段时间后?

时间:2014-09-29 04:46:55

标签: java multithreading concurrency synchronization

在浏览了一下后,我无法找到问题的解决方案。

我的班级box.java有自己的锁,其中包含方法methodAmethodB

我有多个线程试图访问这些框对象。我想要的是线程尝试执行methodA,并且在一定时间后,如果它无法获得框上的锁定,则执行methodB

有没有办法在Java中执行此操作?

提前致谢!

3 个答案:

答案 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)

有很多方法可以做到。

  1. 您可以在java中使用synchronized methods来获取锁定和使用 thread.wait()。{/ li>中的synchronized method方法
  2. 您可以在java
  3. 中使用semaphore
  4. 使用blocking queues
  5. 您可以获得以上所有here的教程。