Я хочу обновить файл в потоке. Я создал отдельный метод для updateXML();
. Thread1 и Thread2 оба вызывают один и тот же метод. Я хочу, чтобы только один метод вызывал метод, другой должен ждать.Синхронизировал один метод между двумя потоками
1
A
ответ
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
Программа закончилась
Смежные вопросы
- 1. Альтернатива между двумя потоками
- 2. Связь Между двумя потоками
- 3. Переключение между двумя потоками
- 4. Связь между двумя потоками
- 5. Как общаться между двумя потоками
- 6. Java разделяет переменную между двумя потоками
- 7. Синхронизация очереди между двумя потоками
- 8. Поделиться QAxObject между двумя потоками?
- 9. Передача значений между двумя потоками
- 10. Share deadline_timer между двумя потоками
- 11. Как объединить один список между двумя бесконечными потоками цикла?
- 12. Как распределить переменную между двумя потоками
- 13. Проблема переключения контекста между двумя потоками
- 14. Threading, связь между двумя потоками C#
- 15. Совместное использование ArrayList между двумя потоками?
- 16. Попытка создать тупик между двумя потоками
- 17. Время задержки между двумя потоками в Java
- 18. Переключение между двумя потоками редукционной саги
- 19. Обмен данными между двумя потоками в java
- 20. Синхронизация событий между двумя потоками в Qt
- 21. Односторонняя связь между двумя потоками через события
- 22. Обновление глобальной varibale между двумя потоками
- 23. Пропустить строку между двумя потоками в java
- 24. Связь между двумя потоками в pthread
- 25. Зеркальные данные между двумя потоками TCP - VB.NET
- 26. Обменявшись ДАННЫЕ между двумя потоками в Python
- 27. Android: Обмен списками между двумя потоками
- 28. Как делиться переменными между двумя потоками в Java?
- 29. Обмен потоками между процессами?
- 30. Форсирование связи между потоками
Ну .. Ответ полагается в названии вашего вопроса. – Maroun