【问题标题】:confused about threads in java对java中的线程感到困惑
【发布时间】:2010-02-11 06:39:16
【问题描述】:

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

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

我已经把这一切都编码了,但它不起作用,所以我开始新的。我的困惑源于我需要这个循环以这个顺序重复多次,但我无法预测哪个线程将首先运行。如果依赖于来自 A 的数据的线程 B 先运行,会发生什么?

另外,我怎样才能让线程无限期地运行?

【问题讨论】:

    标签: java multithreading synchronization


    【解决方案1】:

    您可以使用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() 在风格上是不好的形式,而是你有一个可以抽象它的函数。我试图在这里使代码简洁易懂。

    希望有帮助!

    【讨论】:

    • Runnable 应该大写,就像所有的类和接口通常都是用 Java 完成的一样。
    • 哈,你说得对。解决了这个问题。这就是为什么我总是说你的代码应该看起来“有点像”我的例子。
    【解决方案2】:
    1. 您可以通过编程方式启动一个 线程在另一个之前。然后在一个 简单的java程序你可以 很确定哪个线程将启动 首先(因为你自己决定!)

    2. 你可以让线程 B 在 空缓冲区或队列(取决于是否 你的线程 B 是一个检索器,并且 解析器)

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

    【讨论】:

    • 我会有一个同步的 getter 来检查队列的大小以完成您的建议,对吗?
    • @tipu:没错,这是常用的模式。
    • 首先启动一个线程并不意味着该线程实际上会先做任何事情。其中有一个竞争条件。
    • @Tronic:同意。这就是为什么我用“在一个简单的java程序中”来限定它。通常在这种类似家庭作业的情况下,它是可重复的。
    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多