2013-11-14 2 views
1

Я хочу обновить файл в потоке. Я создал отдельный метод для updateXML();. Thread1 и Thread2 оба вызывают один и тот же метод. Я хочу, чтобы только один метод вызывал метод, другой должен ждать.Синхронизировал один метод между двумя потоками

+1

Ну .. Ответ полагается в названии вашего вопроса. – Maroun

ответ

1
synchronized void updateXML() { 
    /* ... */ 
} 

Это, однако, также блокирует другие synchronized методы класса. Вы можете использовать объект блокировки в случае необходимости:

private final Object updateXmlLock = new Object(); 

void updateXML() { 
    synchronized(updateXmlLock) { 
     /* ... */ 
    } 
} 

Вы можете прочитать больше о intrinsic locks и synchronized methods в учебнике Java.

0

extract 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, давая им (!!! важно) тот же экземпляр вашего класса обновления 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 

Программа закончилась

Смежные вопросы