首页javaconcurrentJava Thread - 如何使用BlockingQueue.take方法

Java Thread - 如何使用BlockingQueue.take方法

我们想知道如何使用BlockingQueue.take方法。
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicLong;

public class Main {
  public static void main(String[] args) throws Exception {
    Runner t = new Runner();
    Thread t1 = new Thread(t);
    for (int i = 0; i < 50; i++) {
      t.queue.add(i);
    }
    System.out.println(("Number of items in queue: " + t.queue.size()));
    t1.start();
    Thread.sleep(1000);
    t1.interrupt();
    t1.join();
    System.out.println(("Number of items in queue: " + t.queue.size()));
    System.out.println(("Joined t1. Finished"));
  }
}
class Runner implements Runnable {
  BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(100);
  AtomicLong m_count = new AtomicLong(0);
  @Override
  public void run() {
    try {
      while (true) {
        queue.take();
        System.out.println("Took item " + m_count.incrementAndGet());
        final long start = System.currentTimeMillis();
        while ((System.currentTimeMillis() - start) < 100) {
          Thread.yield(); // Spin wait
        }
      }
    } catch (Exception ex) {
      System.out.println("Interrupted. Count: " + m_count.get());
    }
  }
}