我正在尝试使用同步方法编写带有线程的java程序。但是当我在另一个线程调用java中的synchronized方法时,我无法理解如何显示已经运行的线程。任何人都可以用简单的例子来解释
答案 0 :(得分:3)
这是一个设计的例子,它显示了交错和阻塞过程。在我的机器上打印:
Thread [Thread-0,5,main]将调用synchronized方法
线程[Thread-1,5,main]将调用同步方法
线程[Thread-0,5,main]在同步方法中 线程[Thread-0,5,main]退出方法
线程[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");
}
}
答案 1 :(得分: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");
}
}
}
如果您愿意,可以轻松地演变此示例以打印哪个线程完全保持锁定。