【求解】LinkedList实现生产者消费者产生的bug!

代码如下,用idea直接运行,消费者就拿不到东西,用debug运行,消费者就能拿到东西!请问原因在什么地方?
import java.util.LinkedList;

/**
 * 用LinkedList实现生产者消费者,
 */

public class ProviderConsumer {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("主线程开始");
        LinkedList<Product> list=new LinkedList<>();
        Producer producer = new Producer(list);
        Consumer consumer = new Consumer(list);

        Thread t1=new Thread(producer);
        Thread t2=new Thread(consumer);
        System.out.println("list: "+list);
        t2.start();
        Thread.sleep(10);
        t1.start();

        //Thread.sleep(30000);
        System.out.println("主线程结束了");
    }
}

/**
 * 生产者
 */

class Producer implements Runnable{
    LinkedList<Product> list;

    public Producer(LinkedList<Product> list) {
        this.list = list;
    }


    @Override
    public void run() {
        System.out.println("线程producer开始: ");
        System.out.println("list: "+list);
        Product product1=new Product();
        product1.setName("AAA");
        list.offerLast(product1);
        System.out.println("生产了" + product1.getName());
        System.out.println("list: "+list);
    }
}

/**
 * 消费者
 */
class Consumer implements Runnable{
    LinkedList<Product> list;

    public Consumer(LinkedList<Product> list) {
        this.list = list;
    }


    @Override
    public void run() {
        System.out.println("线程Consumer开始: ");
        System.out.println("list: "+list);
        while (true){
            if(list.size()>0){
                System.out.println("消费了:"+list.pollFirst());
                System.out.println("list: "+list);
            }

        }
    }
}

/**
 * 产品
 */

class Product{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Product{" +
                "name='" + name + '\'' +
                '}';
    }
}

正常运行结果,消费者一直无法拿到AAA,判断size一直为0,

debug模式结果,判断size为1,可以拿到AAA,

#笔试题目##Java##题解##笔经#
全部评论
主线程直接结束了,其他创建的线程应该就结束了,你最后再加一句sleep看看
点赞 回复
分享
发布于 2019-12-31 00:05
问题在于17和18行代码   t2.start(); Thread.sleep(10); start方法将t2线程加入到主线程的线程组中,作为他的子线程运行,将sleep(10)去掉就能避免t2线程无法使用。
点赞 回复
分享
发布于 2020-01-09 21:58
联易融
校招火热招聘中
官网直投

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务