我想更新线程中的文件。我为updateXML();
创建了一个单独的方法。
Thread1和Thread2都调用相同的方法。我只想要一种方法来调用方法,另一种方法应该等待。
答案 0 :(得分:1)
synchronized void updateXML() {
/* ... */
}
但是,这也会锁定该类的其他synchronized
方法。如有必要,您可以使用锁定对象:
private final Object updateXmlLock = new Object();
void updateXML() {
synchronized(updateXmlLock) {
/* ... */
}
}
您可以在Java教程中阅读有关intrinsic locks和synchronized methods的更多信息。
答案 1 :(得分:0)
提取updateXML()方法来分离类,而不是在Runnable实现中。使此方法成为同步方法。像这样:
public class XmlUpdater {
public synchronized void updateXml() {
// do something. I imitate work :)
try {
System.out.println(Thread.currentThread().getName() + ". Updating XML");
Thread.sleep(10000);
System.out.println(Thread.currentThread().getName() + ". Updated successfully");
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
现在,创建你的线程或runnables,给它们(!!! important)你的xml更新类的同一个实例。使用它:)主类的例子:
public class ThreadTest {
static class TestRunnable implements Runnable {
private XmlUpdater updater;
TestRunnable(XmlUpdater updater) {
this.updater = updater;
}
public void run() {
updater.updateXml();
}
}
public static void main(String[] args) throws InterruptedException {
XmlUpdater updater = new XmlUpdater();
//NOTE the updater object is same for two runnables
Runnable runnable1 = new TestRunnable(updater);
Runnable runnable2 = new TestRunnable(updater);
Thread t1 = new Thread(runnable1);
Thread t2 = new Thread(runnable2);
System.out.println("Threads started");
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Program ended");
}
}
我的输出是:
Threads started
Thread-0. Updating XML
Thread-0. Updated successfully
Thread-1. Updating XML
Thread-1. Updated successfully
程序已结束