混淆java中的线程

时间:2010-02-11 06:39:16

标签: java multithreading synchronization

我在理论上理解线程,但我不知道如何在Java中实现它们。

setup

圆圈应该是线程,矩形应该是缓冲区。

我有这个全部编码,但它不起作用,所以我开始新的。我的困惑之源来自于我需要这个循环重复多次并按此顺序,但我无法预测首先运行什么线程。如果依赖A的数据的线程B首先运行,会发生什么?

另外,如何让线程无限期运行?

3 个答案:

答案 0 :(得分:6)

您可以使用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功能。当你开始时,你必须种子其中一个队列才能开始,可能是链接队列。直接调用partner.queue.take()是风格上不好的形式,而不是你有一个抽象的函数。我正在尝试使代码简洁易懂。

希望有所帮助!

答案 1 :(得分:3)

  1. 您可以以编程方式启动一个 在另一个之前。然后在一个 你可以使用简单的java程序 很确定哪个线程会启动 首先(因为你决定!)

  2. 您可以阻止线程B 空缓冲区或队列(取决于是否 你的线程B是一个猎犬和 解析器)

  3. 您可以使用“并发”,“生产者”和“消费者”等关键字找到关于此主题的更多文献

答案 2 :(得分:1)