空中网多线程面试题2

 //第二题:现成程序中的Test类中的代码在不断地产生数据,然后交给TestDo.doSome()方法去处理,就好像生产者在不断地产生数据,消费者在不断消费数据。请将程序改造成有10个线程来消费生成者产生的数据,这些消费者都调用TestDo.doSome()方法去进行处理,故每个消费者都需要一秒才能处理完,程序应保证这些消费者线程依次有序地消费数据,只有上一个消费者消费完后,下一个消费者才能消费数据,下一个消费者是谁都可以,但要保证这些消费者线程拿到的数据是有顺序的。原始代码如下:

	package queue;
	
	public class Test {
	
		public static void main(String[] args) {
			
			System.out.println("begin:"+(System.currentTimeMillis()/1000));
			for(int i=0;i<10;i++){  //这行不能改动
				String input = i+"";  //这行不能改动
				String output = TestDo.doSome(input);
				System.out.println(Thread.currentThread().getName()+ ":" + output);
			}
		}
	}
	
	//不能改动此TestDo类
	class TestDo {
		public static String doSome(String input){
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			String output = input + ":"+ (System.currentTimeMillis() / 1000);
			return output;
		}
	}


使用阻塞队列实现该功能


package cn.zto.skytwo;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*
 * 现成程序中的Test类中的代码在不断地产生数据,然后交给TestDo.doSome()方法去处理,
 * 就好像生产者在不断地产生数据,消费者在不断消费数据。
 * 请将程序改造成有10个线程来消费生成者产生的数据,
 * 这些消费者都调用TestDo.doSome()方法去进行处理,
 * 故每个消费者都需要一秒才能处理完,程序应保证这些消费者线程依次有序地消费数据,
 * 只有上一个消费者消费完后,下一个消费者才能消费数据,下一个消费者是谁都可以,
 * 但要保证这些消费者线程拿到的数据是有顺序的。
 */
public class Test {
	
		public static void main(String[] args) {
			
			ExecutorService service = Executors.newFixedThreadPool(10);
			final Lock lock = new ReentrantLock();
			final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1);
			System.out.println("begin:"+(System.currentTimeMillis()/1000));
			for(int i=0;i<10;i++){  //这行不能改动
				String input = i+"";  //这行不能改动
				
				try {
					queue.put(input);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				service.execute(new Runnable() {
					
					@Override
					public void run() {
						try {
							lock.lock();
							String output = TestDo.doSome(queue.take());
							System.out.println(Thread.currentThread().getName()+ ":" + output);
							lock.unlock();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				});
			}
			
			
			service.shutdown();
		}
	}
	
	//不能改动此TestDo类
	class TestDo {
		public static String doSome(String input){
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			String output = input + ":"+ (System.currentTimeMillis() / 1000);
			return output;
		}
	}


运行效果如下:


begin:1404732701
pool-1-thread-1:0:1404732702
pool-1-thread-2:1:1404732703
pool-1-thread-3:2:1404732704
pool-1-thread-4:3:1404732705
pool-1-thread-5:4:1404732706
pool-1-thread-6:5:1404732707
pool-1-thread-7:6:1404732708
pool-1-thread-8:7:1404732709
pool-1-thread-9:8:1404732710
pool-1-thread-10:9:1404732711


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值