【发布时间】:2010-02-11 06:39:16
【问题描述】:
我在理论上理解线程,但我不知道如何在 Java 中实现它们。
圆圈应该是线程,矩形应该是缓冲区。
我已经把这一切都编码了,但它不起作用,所以我开始新的。我的困惑源于我需要这个循环以这个顺序重复多次,但我无法预测哪个线程将首先运行。如果依赖于来自 A 的数据的线程 B 先运行,会发生什么?
另外,我怎样才能让线程无限期地运行?
【问题讨论】:
标签: java multithreading synchronization
我在理论上理解线程,但我不知道如何在 Java 中实现它们。
圆圈应该是线程,矩形应该是缓冲区。
我已经把这一切都编码了,但它不起作用,所以我开始新的。我的困惑源于我需要这个循环以这个顺序重复多次,但我无法预测哪个线程将首先运行。如果依赖于来自 A 的数据的线程 B 先运行,会发生什么?
另外,我怎样才能让线程无限期地运行?
【问题讨论】:
标签: java multithreading synchronization
您可以使用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程序你可以 很确定哪个线程将启动 首先(因为你自己决定!)
你可以让线程 B 在 空缓冲区或队列(取决于是否 你的线程 B 是一个检索器,并且 解析器)
您可以通过使用“并发”、“生产者”和“消费者”等关键字找到更多关于此主题的文献
【讨论】: