запутался в темах в Java - PullRequest
       22

запутался в темах в Java

1 голос
/ 11 февраля 2010

Теоретически я понимаю потоки, но понятия не имею, как реализовать их в Java.

setup

Круги должны быть нитями, а прямоугольники - буферами.

У меня все это закодировано, но оно не работает, поэтому я начинаю новое. Мой источник путаницы связан с тем фактом, что мне нужно повторять этот цикл много раз и в таком порядке, но я не могу предсказать, какой поток будет выполняться первым. Если поток B, который опирается на данные из A, запускается первым, что происходит?

Кроме того, как я могу поддерживать непрерывную работу потоков?

Ответы [ 3 ]

6 голосов
/ 11 февраля 2010

Вы можете использовать Blocking Queues в качестве буферов. Они обрабатывают все, вплоть до получения потоков, ожидающих других потоков, когда очереди пусты.

Обычно у вас будет два класса, по одному для каждого потока. Итак, у вас будет что-то вроде этого.

class PageToRetriveQueue implements Runnable{
   PageBuffer partner;
   BlockingQeueue queue = new LinkedBlockingQueue<Page>();

   public void run(){
     while(true){
       Page p = partner.queue.take();
       for(Link l : p){
         queue.offer(l);
       }
     }
   }
}

class PageBuffer implements Runnable{
   PageToRetriveQueue partner;
   BlockingQeueue queue = new LinkedBlockingQueue<Link>();

   public void run(){
     while(true){
        Link l = partner.queue.take();
        Page p = downloadPage(l);
        queue.offer(p);
     }
   }
}

Вам нужно будет реализовать функции Page, Link и DownloadPage. Когда вы начнете, вам нужно будет seed одна из очередей, чтобы начать, вероятно, очередь ссылок. Стилистически плохая форма прямого вызова partner.queue.take (), скорее, у вас есть функция, которая абстрагирует это. Я пытаюсь сделать код кратким и легким для понимания здесь.

Надеюсь, это поможет!

3 голосов
/ 11 февраля 2010
  1. Вы можете программно начать один нить перед другим. Тогда в простая программа Java, вы можете быть почти уверен, какой поток начнется сначала (потому что вы решаете!)

  2. Вы можете заблокировать поток B пустой буфер или очередь (зависит от ваша нить B является ретривером и анализатор)

Вы можете найти больше литературы по этой теме, используя такие ключевые слова, как «параллелизм», «производитель» и «потребитель»

1 голос
/ 11 февраля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...