楼主看一下,加一个锁。- package cn.itcast.day1;
- import java.util.concurrent.ArrayBlockingQueue;
- import java.util.concurrent.BlockingQueue;
- public class BlockingQueueTest {
- public static void main(String[] args){
- final BlockingQueue queue = new ArrayBlockingQueue(3);
- for(int i=0;i<2;i++){
- new Thread(){
- public void run(){
- while(true){
- try{
- Thread.sleep((long)(Math.random()*1000));
- System.out.println(Thread.currentThread().getName() + "准备放数据");
- queue.put(1);//我的问题是:怎么让这行代码和下一行代码一起执行
- System.out.println(Thread.currentThread().getName()+"已放数据,"
- +"目前队列有"+queue.size()+"个数据");
- }catch(InterruptedException e){
- e.printStackTrace();
- }
- }
- }
- }.start();
- }
- new Thread(){
- public void run(){
- while(true){
- try{//将此处的睡眠时间分别改为100和1000,观察运行结果
- Thread.sleep(1000);
- System.out.println(Thread.currentThread().getName()+"准备取出数据,");
-
- synchronized (BlockingQueueTest.class) {
- queue.take();//问题:怎么放这行代码和下一行代码一起执行。
- System.out.println(Thread.currentThread().getName()+"已经取走数据,"+
- "队列目前有"+queue.size()+"个数据");
- }
-
- } catch(InterruptedException e){
- e.printStackTrace();
- }
- }
- }
- }.start();
- }
- }
- /*
- Thread-0已经放了数据,队列目前有3个数据 //这行和下一行diamond之所以打印出了饿个数据就是因为注释中的两行代码没有一起执行
- Thread-2已经取走数据,队列目前有3个数据 //怎么才能让他们一起执行啊,让他们同步,加上synchronized(BlockingQueueTest)不行啊
- */
复制代码 |