我在理论上了解线程,但我不知道如何在 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/