Страница 1 из 1
Классическая задача ассинхронных потоков
Добавлено: 04 мар 2014, 11:37
Nyashka
Здравствуйте
Задача классическая. Есть два потока выполняющих какую то работу, и по завершению вызывающие метод workDone(this) известного им обоим одного экземпляра планировщика. Данный метод выполняемый в двух разных потоках запускает впоследствии некий другой поток если это не сделали до него. Проблема в том что эти начальные два потока могут завершить выполнение одновременно, следовательно код будет выполнен параллельно, и оба проскочат в выставленную блокировку типа:
Код: Выделить всё
if(!blocked){
blocked=true;
startNewTherad();
}
в результате чего будет сформировано два потока вместо одного.
Делать отдельный таймер сидящий в потоке планировщика и опрашивающий каждую милисекунду классы вышеизложенных потоков кажется не совсем разумным. Быть может есть более красивое решение известное андроид сообществу?
Re: Классическая задача ассинхронных потоков
Добавлено: 04 мар 2014, 12:04
adarash
Handler?
Re: Классическая задача ассинхронных потоков
Добавлено: 04 мар 2014, 12:10
Foenix
Про потоки теорию читай! Синхронизированные методы писать надо.
Re: Классическая задача ассинхронных потоков
Добавлено: 04 мар 2014, 12:20
Nyashka
adarash писал(а):Handler?
Именно об обработчике и подумал когда предположил что есть более простое решение задачи, ведь обработка сообщений, во первых, выполняется в потоке самого обработчика, во вторых, делается последовательно. Однако ни разу не работал с ними, поэтому поинтересовался здесь.
Re: Классическая задача ассинхронных потоков
Добавлено: 04 мар 2014, 12:29
adarash
Ничего сложного. Постишь ему код в обертке Runnable и он их выполняет в порядке очереди (или с задержкой становления в очередь) и все. Один вперед другого не полезет.
Re: Классическая задача ассинхронных потоков
Добавлено: 04 мар 2014, 18:44
Mikhail_dev
Слушайте Инну, она правильно указала про синхронизированне потоки. Каким тут боком Handler, ума не приложу.
Re: Классическая задача ассинхронных потоков
Добавлено: 04 мар 2014, 19:24
Foenix
m090050 писал(а):Слушайте Инну, она правильно указала про синхронизированне потоки. Каким тут боком Handler, ума не приложу.
Миша, автор совершенно верно в названии упомянул слово "классическая", а хочет изобрести велосипед. Это уже даже не удивляет

Re: Классическая задача ассинхронных потоков
Добавлено: 05 мар 2014, 14:59
altwin
Nyashka писал(а):Здравствуйте
Задача классическая. Есть два потока выполняющих какую то работу, и по завершению вызывающие метод workDone(this) известного им обоим одного экземпляра планировщика. Данный метод выполняемый в двух разных потоках запускает впоследствии некий другой поток если это не сделали до него. Проблема в том что эти начальные два потока могут завершить выполнение одновременно, следовательно код будет выполнен параллельно, и оба проскочат в выставленную блокировку типа:
Код: Выделить всё
if(!blocked){
blocked=true;
startNewTherad();
}
в результате чего будет сформировано два потока вместо одного.
Делать отдельный таймер сидящий в потоке планировщика и опрашивающий каждую милисекунду классы вышеизложенных потоков кажется не совсем разумным. Быть может есть более красивое решение известное андроид сообществу?
Lock() ?
http://stackoverflow.com/a/4201734/2611075
P.S. полезно для почитать:
Java Concurrency in Practice
и посмотреть:
http://www.youtube.com/watch?v=s032s29- ... -qJdf38oKp
Re: Классическая задача ассинхронных потоков
Добавлено: 18 авг 2014, 11:14
Nyashka
Спасибо всем за советы. Handler исправно функционировал до тех пор пока не понадобилось вынести его работу в отдельный поток, под вышеописанную задачу он вполне подходил. Более короткое и менее требовательное решение подсказали в остальных комментариях, а именно через Lock();
На всякий случай приведу код данного решения, на случай если кому то понадобится решить подобную задачу:
Код: Выделить всё
Lock lock = new ReentrantLock();
if (lock.tryLock()) {
try {
if (!block) {
block = true;
// делаем что хотели
}
} finally {
lock.unlock();
}
}
Возможно, на месте ReentrantLock(); можно подставить блокировщики другого типа. Вопрос разобрал не до конца, но даже так оно работает