powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Шаблон Observer: как заставить наблюдателя вести обработку в другом потоке ?
5 сообщений из 5, страница 1 из 1
Шаблон Observer: как заставить наблюдателя вести обработку в другом потоке ?
    #38441858
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Есть вычурная задача, навеянная чтением доки:
1. класс, создающий большие нечётные числа (в примере ниже - это NumProducer) и расширяющий класс Observable для оповещения "всех страждущих";
2 два "страждущих" класса-наблюдателя, ждущих изменений от NumProducer'a:
2.1. NumFactor - его задача есть факторизация BigInteger числа, хранимого в объекте NumProducer (т.е. разложение на простые множители);
2.2. NumLogger - его задача есть запись в лог того BigInteger-числа, что только что создалось и сидит в объекте NumProducer.

NumProducer генерит числа в двух потоках (на моей машине они всегда имеют номера 10 и 11).
Задача в том, чтобы NumFactor и NumLogger занимались своей обработкой *не* в 10 и11 потоках, а в своих собственных.
Не могу понять, как это всё "свести воедино", поможыте плз.

Вот код (сильно прошу не пинать, учусь ибо):
Код: 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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
import java.util.*;
import java.math.*;
import java.text.*;
class NumHandling {
  private static DateFormat df = new SimpleDateFormat("HH:mm:ss.SSS");

static class NumProducer extends Observable implements Runnable {
  private final static int MAX_BITS = 48; // max count of bits in BigInt numbers
  private static Random r = new Random();

  private final BigInteger bi;
  private final long creatorTid; // tid that creates object and sumbit it to be handled
  private final Date creatorTime;

  private NumProducer() {
    bi = new BigInteger(MAX_BITS, r).or(BigInteger.ONE); // always *odd* number!
    creatorTid = Thread.currentThread().getId();
    creatorTime = new Date(); // cal.getTime();
  }

  static NumProducer getNew() { // fabrica
    return new NumProducer();
  }
  
  public String toString() { return bi+" (creatorTid="+creatorTid+", creatorTime="+df.format(creatorTime)+")"; }

  public int hashCode() { return bi.hashCode(); }
  public boolean equals(Object o) { return o instanceof NumProducer && ((NumProducer)o).bi.equals(bi); }

  public void run() {
    long tid = Thread.currentThread().getId();
    for(int i=0; i<3; i++) {
      NumProducer p = NumProducer.getNew();
      System.out.println( "NumProducer, tid="+tid+": create num="+p );
     
      // make just created object `p` be visible to all involved observers:
      setChanged();       // from Observable class
      notifyObservers(p); // from Observable class

      try {Thread.sleep(500 + r.nextInt(500) );} catch(Exception x){x.printStackTrace();}
    }
  }

}

static class NumFactor implements Runnable, Observer {
  @Override
  public void run() {
    long tid = Thread.currentThread().getId();
    System.out.println("NumFactor, run(), tid="+tid);
  }

  @Override
  public void update(Observable arg0, Object arg1) {
    System.out.println("NumFactor, tid="+Thread.currentThread().getId()+": have to factorize num="+arg1);

    // todo: make factorization of generated number (arg1)

  }
}

static class NumLogger implements Observer, Runnable {
  @Override
  public void run() {
    long tid = Thread.currentThread().getId();
    System.out.println("NumLogger, run(), tid="+tid);
    // how ??? >>> update(Observable arg0, Object arg1)
  }
  @Override
  public void update(Observable arg0, Object arg1) {
    System.out.println("NumLogger, tid="+Thread.currentThread().getId()+": have to log num="+arg1);

    // todo: make logging of generated number (arg1)

  }
}

  //////////////////////////   m a i n   //////////////////////////

  public static void main(String[] aa) {
    
    NumFactor o0 = new NumFactor();
    NumLogger o1 = new NumLogger();
    NumProducer p = new NumProducer();

    Thread ts0 = new Thread(o0);
    Thread ts1 = new Thread(o1);
    ts0.start();
    ts1.start();

    p.addObserver(o0);
    p.addObserver(o1);

    Thread t0 = new Thread(p);
    Thread t1 = new Thread(p);
    t0.start();
    t1.start();
  }
} // class PrimesHandling



Output:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
NumFactor, run(),  tid=8 
NumLogger, run(),  tid=9 
NumProducer, tid=10: create num=26328559610221 (creatorTid=10, creatorTime=20:09:22.690)
NumProducer, tid=11: create num=190363836163951 (creatorTid=11, creatorTime=20:09:22.690)
NumLogger,  tid=10 : have to log num=26328559610221 (creatorTid=10, creatorTime=20:09:22.690)
NumLogger,  tid=11 : have to log num=190363836163951 (creatorTid=11, creatorTime=20:09:22.690)
NumFactor,  tid=10 : have to factorize num=26328559610221 (creatorTid=10, creatorTime=20:09:22.690)
NumFactor,  tid=11 : have to factorize num=190363836163951 (creatorTid=11, creatorTime=20:09:22.690)
NumProducer, tid=11: create num=47378974542453 (creatorTid=11, creatorTime=20:09:23.330)
NumLogger, tid=11: have to log num=47378974542453 (creatorTid=11, creatorTime=20:09:23.330)
NumFactor, tid=11: have to factorize num=47378974542453 (creatorTid=11, creatorTime=20:09:23.330)
NumProducer, tid=10: create num=48260041978835 (creatorTid=10, creatorTime=20:09:23.690)
NumLogger, tid=10: have to log num=48260041978835 (creatorTid=10, creatorTime=20:09:23.690)
NumFactor, tid=10: have to factorize num=48260041978835 (creatorTid=10, creatorTime=20:09:23.690)
NumProducer, tid=11: create num=207469418360109 (creatorTid=11, creatorTime=20:09:23.830)
NumLogger, tid=11: have to log num=207469418360109 (creatorTid=11, creatorTime=20:09:23.830)
NumFactor, tid=11: have to factorize num=207469418360109 (creatorTid=11, creatorTime=20:09:23.830)
NumProducer, tid=10: create num=260987830801937 (creatorTid=10, creatorTime=20:09:24.362)
NumLogger, tid=10: have to log num=260987830801937 (creatorTid=10, creatorTime=20:09:24.362)
NumFactor, tid=10: have to factorize num=260987830801937 (creatorTid=10, creatorTime=20:09:24.362)

Как сделать, чтобы для NumLogger'a вместо tid=10/11 было tid=9, и аналогично для NumFactor'a чтобы было tid=8 ?
...
Рейтинг: 0 / 0
Шаблон Observer: как заставить наблюдателя вести обработку в другом потоке ?
    #38441869
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем вам весь этот огород с обсерверами, если можно создать очередь общую для всех, а все акторы запустить в своем потоке?
Одни кладут в очередь, другие достают
...
Рейтинг: 0 / 0
Шаблон Observer: как заставить наблюдателя вести обработку в другом потоке ?
    #38441873
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никзачем вам весь этот огород с обсерверами, если можно создать очередь общую для всех, а все акторы запустить в своем потоке?
Одни кладут в очередь, другие достаютЭто не производственная задача, учёба всего лишь.
Просто хочу понять: можно ли заставить наблюдателя молотить в своем потоке (отличном от "оповещателя") или нет.
...
Рейтинг: 0 / 0
Шаблон Observer: как заставить наблюдателя вести обработку в другом потоке ?
    #38441900
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis ,
Вынужден признать, что задача звучит очень бредово, даже для обучения. Кто кладет? Куда кладет? Зачем кладет? Непонятно. Хотите поэкспериментировать с передачей задачи из потока в поток - напишите свой thread pool. Пускай у вас будет объект, в котором хранится некая очередь задач. Пускай у вас будет N потоков, которые слушают эту очередь, и в момент появления в ней задачи, забирают ее оттуда, и пытаются выполнить.
- Сделайте это через synchronized/wait/notifyAll
- Сделайте это через Lock/await/signalAll
- Сделайте это через BlockingQueue
- Сделайте это через Semaphore
- Да хоть через Atomic'и это сделайте

Вот тогда вы многое поймете. А сейчас вы взяли две несвязанные задачи - паттерн и передачу данных между потоками - и пытаетесь скрестись уже с ежом. Само собой, получается какая-то хрень. Лучше учитесь этим вещам иолированно. Потоки - потокам, паттерны - паттернам.
...
Рейтинг: 0 / 0
Шаблон Observer: как заставить наблюдателя вести обработку в другом потоке ?
    #38441903
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjvКто кладет? Куда кладет? Зачем кладет? Непонятно.Ну, вот такой получилась эта задачка в голове моей... сам себе выдумал... :-)
ОК, попробую методы, которые Вы перечислили.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Шаблон Observer: как заставить наблюдателя вести обработку в другом потоке ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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