Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / снова потоки / 11 сообщений из 11, страница 1 из 1
27.10.2014, 17:09
    #38788448
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова потоки
Подскажите, правильно ли я делаю, дело в том, что все потоки, созданные вначале, завершаются один после другого по порядку - как я понимаю, это не есть правильно. Это потому что все потоки используют один и тоже class Creator?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
Creator _instance = new Creator();
Process proc = new Process(_instance);	
for (int i = 0; i < 100; i++) {
	new Thread(proc).start();
}


//******************************


class Process implements Runnable {
	
	private Creator _instance;

	public Process(SocketCreator _instance) {
		this._instance=_instance;
	}

	@Override
	public void run() {
		_instance.create();
	}
}


//******************************


public class Creator {
	
	private int counter;
	
	public void create() {
		// do much of work here
	}
	
	public int getCreatedThreadsCounter...
	public void setCreatedThreadsCounter...

}
...
Рейтинг: 0 / 0
27.10.2014, 17:12
    #38788451
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова потоки
Потоки в приведенном коде запускаются по очереди. Поэтому и завершаются в том же порядке. Возможно, за редким исключением.
Что именно смущает? Примитивов синхронизации не замечено.
CyclicBarrier позволяет приостановить все потоки и потом "отпустить" их одновременно. В этом случае вам будет проще выявить ошибки в не синхронизированого счетчика.
...
Рейтинг: 0 / 0
27.10.2014, 17:21
    #38788462
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова потоки
По моему ты путаешь причину со следствием. Причина - это алгоритм.
У тебя он неочевиден и непонятно что нужно сделать в конце.

Сейчас сходу ответить на твой вопрос невозможно потому-что он будет
неполным. Нельзя строить какие-то мнимые правила на базе огрызков
кода.

Синхронизировать завершения потоков не обязательно. Их результат
может быть зафиксирован иным путём отличным от механизмов join
(можно к примеру скинуть репортик в свой текстовый файлик). Вобщем
всё зависит от задачи. А есть даже такие парадигмы программирования
где считается правильным запускать "потоки камикадзе".
...
Рейтинг: 0 / 0
27.10.2014, 17:37
    #38788482
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова потоки
я что имею ввиду - вначале создалась куча потоков, и все они обращаются к одному и тому же методу create() того же самого объекта - т.е. это не является узким местом?

как они могут выполнять этот метод одновременно, объект же один, получается что кто-то один его выполняет, а другие ждут??? тогда это объясняет что они завершаются один за другим по очереди... или все-таки могут???
...
Рейтинг: 0 / 0
27.10.2014, 17:45
    #38788496
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова потоки
rema174я что имею ввиду - вначале создалась куча потоков
Нет. Потоки создаются по очереди. А не "вначале".

rema174, и все они обращаются к одному и тому же методу create() того же самого объекта - т.е. это не является узким местом?

Нет. У вас какое-то концептуальное непонимание потоков. Методы это поведение. Они не являются критическим ресурсом сами по себе.

rema174как они могут выполнять этот метод одновременно, объект же один, получается что кто-то один его выполняет, а другие ждут??? тогда это объясняет что они завершаются один за другим по очереди... или все-таки могут???
Метод это метод. Набор инструкций для исполнения. Не важно какому объекту он пренадлежит. Потоки могут исполнять инструкции параллельно. Проблемы возникают из-за критических ресурсов - областей памяти, которые потокам приходится использовать одновременно.
...
Рейтинг: 0 / 0
27.10.2014, 18:24
    #38788538
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова потоки
BlazkowiczНет. Потоки создаются по очереди. А не "вначале".
да, по очереди, но практически в одно и тоже время, верно? а учитывая, что приоритет у них у одинаковый, то в каком порядке они завершатся неизвестно, верно? значит если они завершаются по очереди, то что-то все-таки определяет их очередность

rema174У вас какое-то концептуальное непонимание потоков. наверное, есть немного :-)

BlazkowiczПроблемы возникают из-за критических ресурсов - областей памяти, которые потокам приходится использовать одновременно.переменная counter - там не показано, но она инкрементится каждый раз сразу в конце create(), получается может так совпасть, что в один и тот же момент времени разные потоки будут изменять ее, но я не заметил каких-то проблем, возможно из-за того, что она изменяется не часто...
...
Рейтинг: 0 / 0
27.10.2014, 20:16
    #38788620
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова потоки
rema174значит если они завершаются по очереди, то что-то все-таки определяет их очередностьСлучайность определяет.
Этот как с SQL select. Нет order by - порядок будет произвольным. Он может и, довольно часто, будет совпадать с порядком вставки записей, но нет никаких гарантий такого поведения.
...
Рейтинг: 0 / 0
27.10.2014, 21:02
    #38788640
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова потоки
rema174да, по очереди, но практически в одно и тоже время, верно?

Нет. У вас тело потока соизмеримо со временем создания и запуска потока.


rema174а учитывая, что приоритет у них у одинаковый, то в каком порядке они завершатся неизвестно, верно? значит если они завершаются по очереди, то что-то все-таки определяет их очередность
В общем случае да. В частных случаях, как например в вашем, видно же что потоки выполняются и завершаются слабо конкурируя.


rema174переменная counter - там не показано, но она инкрементится каждый раз сразу в конце create(), получается может так совпасть, что в один и тот же момент времени разные потоки будут изменять ее, но я не заметил каких-то проблем, возможно из-за того, что она изменяется не часто...
Я никогда не видел серых лошадей. Из чего я могу сделать вывод что их не существует.
...
Рейтинг: 0 / 0
27.10.2014, 21:39
    #38788658
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова потоки
BlazkowiczЯ никогда не видел серых лошадей. Из чего я могу сделать вывод что их не существует.
это я к тому, что похоже это тот случай, когда нужно применять модификатор volatile к полю класса
...
Рейтинг: 0 / 0
28.10.2014, 06:52
    #38788820
Santex78
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова потоки
rema174, Я бы порешал ваш вопрос экспериментально - нет лучшего способа понять как что-то работает, как только не провести эксперимент. Например внутри метода, насчет которого у вас сомнения встройте рандомную задержку и посмотрите, будут ли они завершаться одновременно или нет.
...
Рейтинг: 0 / 0
28.10.2014, 09:09
    #38788878
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова потоки
rema174это я к тому, что похоже это тот случай, когда нужно применять модификатор volatile к полю класса
Нет. Это тот случай когда нужно начинать читать статьи про мониторы, семафоры, взаимоблокировки, volatile и CAS. Сейчас даже на русском этого материала как грязи. Через volatile нельзя обезопасить счетчик, так как инкремент это не атомарная операция.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / снова потоки / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]