开发者

confused about threads in java

I understand threads in theory, but I h开发者_开发技巧ave no idea how to implement them in Java.

confused about threads in java

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?


You can use Blocking Queues 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!


  1. You can programatically start one thread before the other. Then in a simple java program you can be pretty sure which thread will start first (because you decide!)

  2. You can make thread B blocked on empty buffer or queue (depends if your thread B is a retriever and parser)

You can find more literature on this topic by using keywords such as 'concurrency', 'producer' and 'consumer'


http://www.java2s.com/Code/Java/Threads/Producer-Consumer.htm

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜