java - 对java中的线程感到困惑

标签 java multithreading synchronization

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

setup

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

我已经对所有这些进行了编码,但它不起作用,所以我要重新开始。我的困惑来自于我需要这个循环以这个顺序重复多次,但我无法预测哪个线程将首先运行。如果依赖于 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/

相关文章:

c++ - 以线程安全的方式设置带有回调的类成员

java - 其中哪一项需要多个处理器?多任务、多处理和多线程

c++ - 有没有办法将 std::async 与 std::experimental::future 一起使用?

multithreading - pthread rwlock从不同线程锁定/解锁

java - android中从 "yyyy-MM-dd hh:mm:ss.SSS"----------> "hh:mm aa"解析日期和时间

java - 在Java中,“this”在构造函数中是否可以为null?

java - 如何在java中计算xml文件中的叶子元素

java - N 以下所有 3 或 5 的倍数之和。 Project Euler

c# - 是否有 .Net 类可以执行 ManualResetEvent.PulseAll() 会执行的操作(如果存在)?

JavaScript 同步 Ajax 请求特性