Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.135.198.49] |
|
Сообщ.
#1
,
|
|
|
public class Synch { class NewThread implements Runnable{ Thread t; NewThread(){ t = new Thread(); t.start(); } public void run() { try{ int i = 0; System.out.println("Я поток номер " + i); i++; Thread.sleep(1000); } catch (InterruptedException e){ System.out.println("поток прерван"); } } } public static void main(String args[]){ int n=Integer.decode(args[0]); int y; NewThread[] Th = new NewThread[n]; for(y=0; y<n;){ Th[y].run(); y++; } } } |
Сообщ.
#2
,
|
|
|
Интересует вот что - возможна ли инициализация массива потоков, и как её следует производить. потому что ясно, что
NewThread[] Th = new NewThread[n]; работает некорректно. |
Сообщ.
#3
,
|
|
|
Некорректно, это в смысле сваливается с NPE? Логично, ибо ты этой конструкцией только сам массив инициализируешь. А элементы кто делать будет?
public static void main(String args[]){ int n=Integer.decode(args[0]); int y; NewThread[] Th = new NewThread[n]; for(y=0; y<n;){ Th[y] = new NewThread(); Th[y].run(); y++; } } Это раз. Только вот содержимое класса NewThread это порнография в чистом виде. Переписывать его не буду, ибо не могу уловить суть того, что должно происходить. Но конструктор, имхо, надо отчистить в любом случае. |
Сообщ.
#4
,
|
|
|
Смею предположить, что автор мечтал увидеть нечто вроде этого(исправлял тупо чтоб работало, изначальный авторский стиль сохранен):
public class Synch { static class NewThread implements Runnable{ Thread t; int i; NewThread(int i){ this.i = i; t = new Thread(this); t.start(); } public void run() { try{ // int i = 0; System.out.println("Я поток номер " + i); // i++; Thread.sleep(1000); } catch (InterruptedException e){ System.out.println("поток прерван"); } } } public static void main(String args[]){ int n=Integer.decode(args[0]); int y; NewThread[] Th = new NewThread[n]; for (int i = 0 ; i < n ;i++) { Th[i] = new NewThread(i); } // for(y=0; y<n;){ // Th[y].run(); // y++; // } } } Добавлено Да, Nort0n, расскажи нам скорей, че ты хотел изобразит то? |
Сообщ.
#5
,
|
|
|
НУ я хочу чтобы у меня создавалось, цитирую:
Есть N>2 потоков , каждый из которых выводит свое имя M>2 раз. Нужно так синхронизовать потоки, чтобы имена выводились поочередно- в каскадном порядке. (имя1 имя 2 имя 3 имя 4 имя 5 …. имя 1 имя 2 имя 3 имя 4 имя 5 …. но синхронизацию я решил пока что отложить и разобраться с массивом. |
Сообщ.
#6
,
|
|
|
public class Synch { static class NewThread implements Runnable{ Thread t; int i; NewThread(){ t = new Thread(this); t.start(); } synchronized public void run(){ int i = 0; for (i=0; i<5; i++){ System.out.print("Я поток номер:" + i+ " "); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(); } } public static void main(String args[]) throws InterruptedException{ int n=Integer.decode(args[0]); int y; NewThread[] Th = new NewThread[n]; for(y=0; y<n;){ Th[y] = new NewThread(); Thread.sleep(1000); Th[y].run(); Thread.sleep(1000); y++; } } } |
Сообщ.
#7
,
|
|
|
[censored]
ЗЫ: Кстати, решение выложил из чистого эгоизма - решил вспомнить работу с потоками, а то, что-то давно этим не занимался, если у кого(обращаюсь в основном к модераторам и Дюку) время будет - гляньте, можно ли это оптимальнее сделать |
Сообщ.
#8
,
|
|
|
Konigsberg, вроде, все прилично. Хотя я тоже давно уже многопоточностью не баловался.
Как вариант модификации, можно сделать очередь, в которую сложить все потоки, и нотифицировать, только следующего в очереди, а себя добавлять в конец. Я правда не уверен, что это будет производительнее |
Сообщ.
#9
,
|
|
|
Цитата DUKe @ Как вариант модификации, можно сделать очередь, в которую сложить все потоки, и нотифицировать, только следующего в очереди, а себя добавлять в конец. Я правда не уверен, что это будет производительнее и как нотифицировать определенный поток? |
Сообщ.
#10
,
|
|
|
Konigsberg, вот такой вот порнографией:
... while (blocked) {} blocked = true; ... setBlocked(boolean blocked) { blocked = false; } Добавлено Хотя, чего-то я не подумал, потоки ж все время активными будут. Не нафиг такое решение |
Сообщ.
#11
,
|
|
|
Цитата DUKe @ Хотя, чего-то я не подумал, потоки ж все время активными будут. Не нафиг такое решение |
Сообщ.
#12
,
|
|
|
Konigsberg, знал, что после таких вечерних развлечений думать вредно... Чего-то я с ужасом понял, что я уже три часа статью пишу. Представляю, что я там написал... Надо утром перечитать. Вообщем заканчивая оффтоп: нормальное ты решение предложил.
|
Сообщ.
#13
,
|
|
|
Ок, сенкс, спать ложись Хотелось бы, что бы ещё wind глянул
|
Сообщ.
#14
,
|
|
|
Короче, констатирую факт: то, что ты изобразил со второй попытки - не пойдёт Почему? (Закрывая глаза на то, что код корявый, ужасный etc.). ПОтоки синхронизированы (?), всё работает (?) |
Сообщ.
#15
,
|
|
|
Цитата Nort0n @ ПОтоки синхронизированы (?), всё работает (?) нет, нет Твой "код" вообще мало чего делает из того, что должен Там даже потоков не то количество создается, что нужно, а уж то, что каждый поток тупо 5 раз выводит "я поток номер: 1, я поток номер 2,..." - ты сам то понимаешь что это бред? Зачем каждому потоку 5 раз писать что он поток номер 1-5? Тебе нужно, чтобы запускались все потоки, потом первый входил в цикл и выполнял первую итерацию, а все остальные ждали свою очередь, потом это делал второй поток, третий... Потом первый принимался за вторую, затем второй, третий... Это всё реализуется методами wait() и notifyAll() на общем для всех потоков мониторе. Советую тебе почитать про эти методы - они очень полезные И ещё - всё должно работать без подгонок с помощью sleep(); |
Сообщ.
#16
,
|
|
|
Цитата Konigsberg @ Хотелось бы, что бы ещё wind глянул Konigsberg, я бы инкапсулировал блокировку в классе, аналогичном вашему Monitor: class PassThruLock { int counter = 0, maximum; public PassThruLock(int maximum) { this.maximum = maximum; } public synchronized void tryPass(int number) throws InterruptedException { while (number != counter) { wait(); } } public synchronized void passed() { counter = (counter + 1) % maximum; notifyAll(); } } |
Сообщ.
#17
,
|
|
|
А, ну это понятно, я в принципе не особо задумывался на счет "проектирования" этого кода... Меня просто всё смущает мой прием с notifyAll() и циклом while() - как то мне не очень нравится, но придумать лучше не смог
|
Сообщ.
#18
,
|
|
|
Цитата Konigsberg @ Меня просто всё смущает мой прием с notifyAll() и циклом while() - как то мне не очень нравится, но придумать лучше не смог Да нет, для примера нормально. Но лучше не использовать голые wait()/notify(), а обернуть их в классы вроде моего, иначе есть шанс помучиться уже с их синхронизацией (всё равно нужен флаг). А ещё лучше - использовать имеющиеся в пакете java.util.concurrent |
Сообщ.
#19
,
|
|
|
Цитата "я поток номер: 1, я поток номер 2,..." - ты сам то понимаешь что это бред? теперь понимаю, спасибо. Цитата И ещё - всё должно работать без подгонок с помощью sleep() я не знал. Спасибо за помощь |
Сообщ.
#20
,
|
|
|
Цитата wind @ А ещё лучше - использовать имеющиеся в пакете java.util.concurrent Ну это если 5ку юзать, в 4-ке то их не было Цитата Nort0n @ я не знал. Спасибо за помощь Не за что, лучше прочти про wait и notify |
Сообщ.
#21
,
|
|
|
Цитата Konigsberg @ Ну это если 5ку юзать, в 4-ке то их не было У автора этих классов есть пакет и для java 1.4 - util.concurrent. Он хоть устроен немного иначе, но предоставляет тот же функционал. |