1

我正在尝试使用同步方法编写一个带有线程的 java 程序。但是我无法理解当另一个线程调用 java 中的同步方法时,我如何显示一个线程已经在运行。任何人都可以用简单的例子来解释

4

2 回答 2

3

这是一个人为的例子,它显示了交错和阻塞过程。在我的机器上打印:

Thread[Thread-0,5,main] 将调用同步方法
Thread[Thread-1,5,main] 将调用同步方法
Thread[Thread-0,5,main] 在同步方法
Thread [Thread-0,5,main] 正在退出方法
Thread[Thread-1,5,main] 在同步方法中
Thread[Thread-1,5,main] 正在退出方法

您可以看到只有一个线程进入同步块,而另一个等待。

public class Test1 {

    public static void main(String[] args) throws Exception {
        final Test1 test = new Test1();
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread() + " is going to call the synchronized method");
                test.method();
            }
        };
        new Thread(r).start();
        new Thread(r).start();
    }

    public synchronized void method() {
        System.out.println(Thread.currentThread() + " is in the synchronized method");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
        }
        System.out.println(Thread.currentThread() + " is exiting the method");
    }
}
于 2012-12-10T08:01:20.373 回答
0

如果我理解正确,您想在一个线程尝试调用同步方法而另一个线程已经在执行它时打印一条消息。您不能使用同步方法或块来执行此操作,但您可以使用java.util.concurrent.locks.Lock接口来执行此操作。您需要的方法是 tryLock()。你可以这样做:

public class Test1 {
    private Lock lock = new ReentrantLock();

    // ...

    public void method() {
        if (lock.tryLock()) {
            try {
                // you successfully acquired the lock, do you logic here
            } finally {
                lock.unlock();
            }                
        } else {
            // lock is hold by another thread
            System.out.println("cannot acquire a lock");
        }
    }
}

如果您愿意,您可以轻松地改进此示例以打印哪个线程准确持有锁。

于 2012-12-10T08:36:00.270 回答