并发编程学习(一)
参考博文:http://blog.youkuaiyun.com/defonds/article/details/44021605/
package test.block.queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* 创建了两个线程,每个线程具有BlockQueue的一个引用,这样两者就可以互相通信
* ,consumer线程可以消费producer线程 完成了两个线程之间的数据传递,共享。
* 这里我们做了一个实验:验证BlockQueue阻塞队列的特征:
* 将ArrayBlockQueue最大阈值设置为1,我们将consumer线程注释掉,
* 这样就会发现线程只会完成第一个元素的存放,不会放入第二个元素
*
* @author caiqiang
* @version 2017年3月25日
* @see BlockQueueTest
* @since
*/
public class BlockQueueTest {
public static void main(String[] args)
throws InterruptedException {
// 创建一个BlockQueue,并用ArrayBlockQueue实例化
BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(1);
Producer producer = new Producer(blockingQueue);
Consumer consumer = new Consumer(blockingQueue);
new Thread(producer).start();
// new Thread(consumer).start();
Thread.sleep(4000);
}
}
package test.block.queue;
import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable {
protected BlockingQueue<String> blockQueue = null;
public Consumer(BlockingQueue<String> blockQueue) {
this.blockQueue = blockQueue;
}
@Override
public void run() {
try {
System.out.println("take from ===>" + blockQueue.take());
Thread.sleep(1000);
System.out.println("take from ===>" + blockQueue.take());
Thread.sleep(1000);
System.out.println("take from ===>" + blockQueue.take());
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package test.block.queue;
import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable {
protected BlockingQueue<String> blockQueue = null;
public Producer(BlockingQueue<String> blockQueue) {
this.blockQueue = blockQueue;
}
@Override
public void run() {
try {
blockQueue.put("1");
// Thread.sleep(1000);
System.out.println("放入第一个元素");
blockQueue.put("2");
// Thread.sleep(1000);
System.out.println("放入第二个元素");
blockQueue.put("3");
// Thread.sleep(1000);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在上述实验中可以发现生产的线程会因最大线程个数为1,而因为没有消费线程阻塞,没有继续存入值。