参考 http://www.cnblogs.com/dolphin0520/p/3932906.html package blockthread; import java.util.ArrayList; import java.util.List; import java.util.PriorityQueue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.PriorityBlockingQueue; public class ThreadBlockingSample { private static int size=10; public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub //List<Integer> queue=new ArrayList<Integer>(size);// change the type you can see the difference between ordinary list, non block queue and blocking queue //PriorityQueue<Integer> queue=new PriorityQueue<Integer>(size);//non blocking queue ArrayBlockingQueue<Integer> queue=new ArrayBlockingQueue<Integer>(size); //must specify a size //LinkedBlockingQueue<Integer> queue=new LinkedBlockingQueue<Integer>(); //max size Integer.MAXVAULE //PriorityBlockingQueue<Integer> queue=new PriorityBlockingQueue<Integer>(); // no limit Producer producer=new Producer(queue); Consumer consumer=new Consumer(queue); producer.start(); consumer.start(); } } class Producer extends Thread implements AddInterface{ Object o; public Producer(Object o){ this.o=o; } public void run(){ System.out.println("Producer begins to add..."); while(true){ synchronized(o){ if(o.getClass().getSimpleName().equals("ArrayList")){ List list=(List)o; if(list.size()==10){ try { o.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block o.notify(); } }else{ add(o,1); o.notify(); } }else{ add(o,1); o.notify(); } } System.out.println("release lock to consumer"); } } @Override public boolean add(Object queue, Integer i) { String queue_type=queue.getClass().getSimpleName(); if(queue_type.equals("ArrayList")){ List q=(List)queue; q.add(i); System.out.println(queue_type+" added 1 and left of size "+q.size()); return true; }else if(queue_type.equals("PriorityQueue")){ PriorityQueue q=(PriorityQueue)queue; q.offer(i); System.out.println(queue_type+" added 1 and left of size "+q.size()); }else if(queue_type.equals("ArrayBlockingQueue")){ ArrayBlockingQueue q=(ArrayBlockingQueue)queue; q.offer(i); System.out.println(queue_type+" added 1 and left of size "+q.size()); }else if(queue_type.equals("LinkedBlockingQueue")){ LinkedBlockingQueue q=(LinkedBlockingQueue)queue; q.offer(i); System.out.println(queue_type+" added 1 and left of size "+q.size()); }else if(queue_type.equals("PriorityBlockingQueue")){ PriorityBlockingQueue q=(PriorityBlockingQueue)queue; q.offer(i); System.out.println(queue_type+" added 1 and left of size "+q.size()); } return false; } } class Consumer extends Thread implements MoveInterface{ Object o; public Consumer(Object o){ this.o=o; } public void run(){ System.out.println("consumer begins to move...."); while(true){ synchronized(o){ if(o.getClass().getSimpleName().equals("ArrayList")){ List list=(List)o; if(list.size()==0){ try { o.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block o.notify(); } }else{ move(o); o.notify(); } }else{ move(o); o.notify(); } } System.out.println("release lock to producer"); } } @Override public boolean move(Object queue) { String queue_type=queue.getClass().getSimpleName(); if(queue_type.equals("ArrayList")){ List q=(List)queue; q.remove(q.size()-1); System.out.println(queue_type+" moved 1 left size "+q.size()); return true; }else if(queue_type.equals("PriorityQueue")){ PriorityQueue q=(PriorityQueue)queue; q.poll(); System.out.println(queue_type+" moved 1 left size "+q.size()); }else if(queue_type.equals("ArrayBlockingQueue")){ ArrayBlockingQueue q=(ArrayBlockingQueue)queue; q.poll(); System.out.println(queue_type+" moved 1 left size "+q.size()); }else if(queue_type.equals("LinkedBlockingQueue")){ LinkedBlockingQueue q=(LinkedBlockingQueue)queue; q.poll(); System.out.println(queue_type+" moved 1 left size "+q.size()); }else if(queue_type.equals("PriorityBlockingQueue")){ PriorityBlockingQueue q=(PriorityBlockingQueue)queue; q.poll(); System.out.println(queue_type+" moved 1 left size "+q.size()); } return false; } }
时间: 2024-10-07 04:06:08