Java 在两个线程之间同步单个方法

Java 在两个线程之间同步单个方法,java,multithreading,wait,synchronized,Java,Multithreading,Wait,Synchronized,我想在线程中更新一个文件。我为updateXML()创建了一个单独的方法。 Thread1和Thread2都在调用相同的方法。我只需要一个方法调用该方法,另一个将等待 synchronized void updateXML() { /* ... */ } 但是,这也会锁定类的其他同步的方法。如有必要,可以使用锁定对象: private final Object updateXmlLock = new Object(); void updateXML() { synchroni

我想在线程中更新一个文件。我为
updateXML()创建了一个单独的方法。
Thread1和Thread2都在调用相同的方法。我只需要一个方法调用该方法,另一个将等待

synchronized void updateXML() {
    /* ... */
}
但是,这也会锁定类的其他
同步的
方法。如有必要,可以使用锁定对象:

private final Object updateXmlLock = new Object();

void updateXML() {
    synchronized(updateXmlLock) {
        /* ... */
    }
}
您可以在Java教程中阅读更多关于和的信息

但是,这也会锁定类的其他
同步的
方法。如有必要,可以使用锁定对象:

private final Object updateXmlLock = new Object();

void updateXML() {
    synchronized(updateXmlLock) {
        /* ... */
    }
}
您可以在Java教程中阅读更多关于和的信息。

将updateXML()方法提取到单独的类中,而不是在可运行的实现中。使此方法成为同步方法。大概是这样的:

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();
    }
}
}
现在,创建线程或可运行程序,为它们(!!!重要)提供与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
程序结束了

提取updateXML()方法以分离类,而不是在可运行实现中。使此方法成为同步方法。大概是这样的:

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();
    }
}
}
现在,创建线程或可运行程序,为它们(!!!重要)提供与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

节目结束得很好。。答案取决于你问题的标题。。答案取决于你问题的标题。