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

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

我已经全部编码了,但是没有用,所以我要重新开始。我感到困惑的原因是,我需要这个循环以这个顺序重复很多次,但是我无法预测哪个线程将首先运行。如果依赖于A的数据的线程B首先运行,会发生什么?

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

最佳答案

您可以将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()是一种糟糕的形式,相反,您会有一个将其抽象的函数。我正在尝试使代码简洁明了且易于理解。

希望能有所帮助!

关于java - 对Java中的线程感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2242722/

10-11 22:12
查看更多