Question: I understand threads in theory, but I have no idea how to implement them in Java. 

![setup](https://i.imgur.com/xIk6S.png)

The circles are supposed to be threads and the rectangles are supposed to be buffers.

I have this all coded but it doesn't work, so I am starting new. My source of confusion comes from the fact that I need this cycle to repeat many times and in this order, but I can't predict what thread will run first. If thread B that relies in data from A runs first, what happens?

Also how can I keep the threads running indefinitely?

Answer: 
You can use [Blocking Queues](http://java.sun.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html) as buffers. They handle everything as far as getting threads to wait for other threads when the queues are empty. 

Basically you'll have two classes, one for each thread. So, you'll have something like this.

```
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);
     }
   }
}

```

You'll have to implement the Page, Link, and downloadPage functions. When you start, you'll have to **seed** one of the queues in order to get started, probably the link queue. It's stylistically bad form to call partner.queue.take() directly, rather you'd have a function that would abstract that. I'm trying to make the code concise and easy to understand here. 

Hope that helps!
<http://www.java2s.com/Code/Java/Threads/Producer-Consumer.htm>