BG Development


Страници: (7) 1 [2] 3 4 ... последна »  ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Java Threads щафета
ivan84
Публикувано на: 23-10-2015, 16:07
Quote Post



Име:
Група: Форумен член
Ранг: Почетен член

Мнения: 8170
Регистриран на: 01.04.11



За кое греша? За това че последователното пускане на нишки не е синхронизация ли?
Това е 100% асинхронна, последователна операция. За какво ти е callback-а? Просто стартирай следващата нишка в края на предходната. Или още по добре, завърти един цикъл в тялото на run-а.
Ако за теб това е синхронизация, ок.

Аз тука не виждам за какво има да се спори.

Това мнение е било редактирано от ivan84 на 23-10-2015, 16:11
PMEmail Poster
Top
FidelDahan
Публикувано на: 23-10-2015, 22:12
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2338
Регистриран на: 12.06.08



Не знам тия даскали какво си мислят че правят когато преподават синхронизационни методи от преди 20 години, но ако такъв ми падне ще го върна да се скрие и назубка една две книжки преди да преподава вредни методи.

Ето едно straight-forward решение без хитрости, толкова праволинейно, че даже не е интересно:

CODE

import java.util.Random;
import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;

class Athlete extends Thread {
 static final Random random = new Random();
 final int id;
 final Exchanger<Integer> take;
 final Exchanger<Integer> pass;

 public Athlete(int id, Exchanger<Integer> take) {
   this.id = id;
   this.take = take;
   this.pass = new Exchanger<>();
 }

 @Override
 public void run() {
   try {
     take.exchange(this.id);
     System.out.println("Starting " + this.id);
     TimeUnit.SECONDS.sleep(random.nextInt(3) + 9);
     System.out.println("Finishing " + this.id);
     pass.exchange(this.id);
   }
   catch (InterruptedException ex) {
     ex.printStackTrace();
     Thread.currentThread().interrupt();
   }
 }
}

public class Main {

 public static void main(String[] args) throws Exception {

   Exchanger<Integer> init = new Exchanger<>();

   Athlete a0 = new Athlete(0, init);
   Athlete a1 = new Athlete(1, a0.pass);
   Athlete a2 = new Athlete(2, a1.pass);
   Athlete a3 = new Athlete(3, a2.pass);

   a0.start();
   a1.start();
   a2.start();
   a3.start();

   init.exchange(-1);
 }
}


ПП: felore, и на мен ми се струва, че пускаш нишките последователно.

Това мнение е било редактирано от FidelDahan на 23-10-2015, 22:21
PMEmail Poster
Top
felore
Публикувано на: 23-10-2015, 22:52
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3872
Регистриран на: 22.10.09



Да, разбира се, но и това е вид синхронизация, не? Прочетете пак поста на човека. Иначе твоето решение е готино, този клас Ексчейнджър не съм подозирал даже, че съществува. icon_smile.gif


--------------------
PMEmail Poster
Top
FidelDahan
Публикувано на: 23-10-2015, 22:57
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2338
Регистриран на: 12.06.08



Ами да, изискването звучи като че ли се иска точно определен метод на имплементация, но не е ясно какво точно трябва да бъде многонишковото поведение. Иначе в java.util.concurrent има много такива синхронизационни елементи.
PMEmail Poster
Top
ivan84
Публикувано на: 24-10-2015, 07:25
Quote Post



Име:
Група: Форумен член
Ранг: Почетен член

Мнения: 8170
Регистриран на: 01.04.11



Има ли начин да се реши задачата точно по условието? В смисъл, синхронизация на няколко нишки по общ обект, които да се нотифицират една по една с notify, но все пак да се спазва някакъв ред.

Според документацията notify ще нотифицира една нишка но не се знае коя (изборът и бил според имплементацията).


--
@FidelDahan защо такова отношение? Това е единствената синхронизация в java. Останалота са готови имплементации. Според мен, като учиш как се синхронизира е редно да учиш именно това. Пък после можеш да разучиш готовите решения.

Това мнение е било редактирано от ivan84 на 24-10-2015, 07:31
PMEmail Poster
Top
0xdeadbeef
Публикувано на: 24-10-2015, 07:57
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 357
Регистриран на: 07.03.14



QUOTE (FidelDahan @ 23-10-2015, 22:12)
Не знам тия даскали какво си мислят че правят когато преподават синхронизационни методи от преди 20 години, ...


дори и към днешна дата никой даскал не преподавава нещата от java.util.concurrent.
Ограничават се със synchronize и дотам.

А за тези дето не го знаят :
пакета е пълен с благини - от прости, сложни, интересни - а бе само мерак да има човек.
PMEmail Poster
Top
bvbfan
Публикувано на: 24-10-2015, 08:03
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2792
Регистриран на: 08.12.13



QUOTE (ivan84 @ 24-10-2015, 08:25)
Според документацията notify ще нотифицира една нишка но не се знае коя (изборът и бил според имплементацията).

Знае се, ще "освободи" първата, която е "блокирала" в чакане на новото състояние. По принцип трябва да има notify_all, за да се "освободят" всички. Цялата реализация е направена на POSIX стандарта за condition_variable и mutex http://en.cppreference.com/w/cpp/thread/co...able/notify_all Не съм Java програмист, но те няма на какво друго да "легнат" освен на С-то icon_razz.gif


--------------------
QUOTE (Bender @ 23-04-2015, 19:11)
Xamarin: ЛАПАЙ!
Ти: Добре...
PMEmail Poster
Top
ivan84
Публикувано на: 24-10-2015, 08:06
Quote Post



Име:
Група: Форумен член
Ранг: Почетен член

Мнения: 8170
Регистриран на: 01.04.11



Дай да видя къде го пише. Щото в документацията пише, че изборът е случаен и зависи от имплементацията.


http://docs.oracle.com/javase/7/docs/api/j...t.html#notify()

Това мнение е било редактирано от ivan84 на 24-10-2015, 08:08
PMEmail Poster
Top
bvbfan
Публикувано на: 24-10-2015, 08:28
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2792
Регистриран на: 08.12.13



QUOTE
If multiple threads are waiting on a condition variable, who gets awakened first when another thread issues a pthread_cond_signal call? As with threads waiting in a lock call to a mutex variable, the waiting threads are released according to their scheduling priority. If all waiting threads are of the same priority, they are released in a first-in first-out order for each pthread_cond_signal call that's issued.

The pthread_cond_broadcast function releases all threads at once from their waits on the condition variable, but there is a hitch. The system can select only one to which to give possession of the mutex. It does so by applying the same criterion it uses when selecting the thread it wakes when a phread_cond_signal call signals a condition≈scheduling order. The chosen thread is given the mutex lock and continues in the code following its pthread_cond_wait call. The other threads are moved to the queue of threads that are waiting to acquire the mutex. Each will resume as each previous thread in the queue acquires the mutex and then releases it.


--------------------
QUOTE (Bender @ 23-04-2015, 19:11)
Xamarin: ЛАПАЙ!
Ти: Добре...
PMEmail Poster
Top
ivan84
Публикувано на: 24-10-2015, 08:32
Quote Post



Име:
Група: Форумен член
Ранг: Почетен член

Мнения: 8170
Регистриран на: 01.04.11



Ама човек, говориме за java.
PMEmail Poster
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (7) 1 [2] 3 4 ... последна » Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0