|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
09.10.2016, 20:21 | #1 |
Пользователь
Регистрация: 27.11.2011
Сообщений: 28
|
почему треды не синхронизируются?
Задача в том чтобы 2 или 3, или 10 тредов(неважно), поочереди(каждый тред поочереди через одну секунду) декрементировали переменную. Сначала просто писал метод и синхронизировал его, потом по объекту делал синхронизацию, тепер делаю все напрямую в методе run, но все равно все треды работают пачкой, и только после выполнения одной итерации, обратно же, все вместе пачкой засыпают. Как последовательно разделить работу? почему синхронизщация не помагает?
Код:
|
09.10.2016, 23:08 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
объект блокировки у каждого потока свой собственный, чего ему другой поток ждать?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
10.10.2016, 16:53 | #3 |
Пользователь
Регистрация: 27.11.2011
Сообщений: 28
|
|
10.10.2016, 17:56 | #4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
таймер не делают кучей потоков
чтоб синхронизация работала как надо, надо чтоб у потоков был общий объект синхронизации. обратите внимание на переменную счетчика Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
10.10.2016, 18:02 | #5 | |
Пользователь
Регистрация: 27.11.2011
Сообщений: 28
|
Цитата:
вот к примеру тоже наваял пример(простите за игру слов): public class qq { public static void main ( String [] args ) throws UnknownHostException, InterruptedException { for (int i = 0; i < 5; i++) { new The().start(); } } public static class The extends Thread { final Counter c = new Counter(); @Override public synchronized void run() { while (true) { c.c(); } } } public static class Counter{ public synchronized void c(){ try { Thread.sleep(1000); System.out.println("qq"); } catch (InterruptedException e) { e.printStackTrace(); } } } } Нужно чтобы надпись выводилась раз в секунду, какой поток будет делать это абсолютно не важно. важно чтобы один поток зашел в тело метода, остановился на секунду, выполнил вывод, и потом зашел другой поток на выполнение. ОбЪясните пожалуйста, как делается сие невежество(( |
|
10.10.2016, 18:12 | #6 |
Пользователь
Регистрация: 27.11.2011
Сообщений: 28
|
Все, уже не надо) я ооочень сильно затупил(( все дело в статик...
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Здравствуйте ! в чем проблема,почему почему время исполнения операций не работает ? | ion leahu | Помощь студентам | 6 | 23.11.2014 19:36 |
А почему бы? | ZuBy | О форуме и сайтах клуба | 6 | 16.09.2013 19:00 |
Существуют ли программы, показывающие все треды, находящиеся в винде и их id? | Ibanez Wizard | Софт | 3 | 30.03.2011 18:21 |
Почему? С++ | xitrec1zaraza | Помощь студентам | 5 | 15.03.2011 20:02 |