面试:请用多线程设计并实现生产者---消费者

 解答过程:

  1.  使用多线程肯定设计到共享变量,进而有并发的可能性。
  2. 解决并发可以使用阻塞BlockingQueue队列。
  3. 代码实现:

        生产者:   

package com.shuofeng.thread;

import java.util.Random;
import java.util.concurrent.BlockingQueue;

public class Producer implements Runnable{
	
	private final BlockingQueue<Integer> queue;
	
	public Producer(BlockingQueue q) {
		this.queue = q;
	}
	
	@Override
	public void run() {
		try {
			while(true) {
				Thread.sleep(1000);
				queue.put(producer());
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	private int producer() {
		int n = new Random().nextInt(10000);
		System.out.println("Thread: " + Thread.currentThread().getName() 
				+ "produce:"+n);
		return n;
	}
	
}

消费者:   

package com.shuofeng.thread;

import java.util.concurrent.BlockingQueue;

public class Consumer implements Runnable {
	
	private final BlockingQueue<Integer> queue;
	
	public Consumer(BlockingQueue q) {
		this.queue = q;
	}
	@Override
	public void run() {
		while(true) {
			try {
				Thread.sleep(2000);
				consumer(queue.take());
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	private void consumer(Integer n) {
		System.out.println("Thread: "+ Thread.currentThread().getName() 
				+"consumer: "+n);
	}
}

main方法:

package com.shuofeng.thread;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class Main {
	
	public static void main(String[] args) {
		BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(100);
		Producer p = new Producer(queue);
		Consumer c1 = new Consumer(queue);
		Consumer c2 = new Consumer(queue);
		Thread producer = new Thread(p);
		producer.setName("生产者线程");
		Thread consumer1 = new Thread(c1);
		consumer1.setName("消费者1");
		Thread consumer2 = new Thread(c2);
		consumer1.setName("消费者2");
		producer.start();
		consumer1.start();
		consumer2.start();
	}
	
}

执行结果:

Thread: 生产者线程produce:6283
Thread: 消费者2consumer: 6283
Thread: 生产者线程produce:2877
Thread: Thread-2consumer: 2877
Thread: 生产者线程produce:1094
Thread: 消费者2consumer: 1094
Thread: 生产者线程produce:8174
Thread: Thread-2consumer: 8174
Thread: 生产者线程produce:7640
Thread: 消费者2consumer: 7640
Thread: 生产者线程produce:114
Thread: Thread-2consumer: 114
Thread: 生产者线程produce:1396
Thread: 消费者2consumer: 1396
Thread: 生产者线程produce:2650
Thread: Thread-2consumer: 2650

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值