空中网的三道面试题

1.现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要4秒种即可打印完16个日志对象,原代码如下:
package com.read;

//空中网面试题1
public class Text1
{
	public static void main(String[] args)
	{
		System.out.println("begin:" +(System.currentTimeMillis()/1000));
		
		for(int i=0;i<16;i++)//不能改
		{
			final String log = ""+(i+1);//不能改
			{
				Text1.parseLog(log);
			}
		}
	}
	public static void parseLog(String log)
    {
    	System.out.println(log+":"+(System.currentTimeMillis()/1000));
    	try
		{
			Thread.sleep(1000);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
    }

}







2.现成程序中主类中的代码在不断地产生数据,然后交给TestDo.doSomething()方法去处理,就好像生产者不断地产生数据,消费者在不断着

数据。请将下面的程序改成由10个线程来消费生产者产生的数据,这些消费者都将调用TestDo.doSomething()方法进行处理,故每个消费都

将花费一秒种处理完,程序应保证有顺性,只有上一个消费者消费完后,下一个消费者才能消费,下一个是哪个消费者无所谓,但要保证消费

者有顺消费,原代码如下:

package com.read;

//空中网面试题2
public class Text2
{
	public static void main(String[] args)
	{
		System.out.println("begin:"+(System.currentTimeMillis()));
		
		for(int i=0;i<10;i++)//不能改
		{
			String input = i+"";//不能改
			String output=TestDo.doSomething(input);
			System.out.println(Thread.currentThread().getName()+":"+output);
		}
		
	}
}
//不能改
class TestDo
{
	public static String doSomething(String input)
	{
		try
		{
			Thread.sleep(1000);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		String output= input+":"+(System.currentTimeMillis()/1000);
		return output;
		
	}
}




3.现有程序同时启动了4个线程去调用TestDo.doSomething(key,value)方法,由于TestDo.doSomething(key,value)方法内的代码是先暂停1 秒,然后再输出以秒为单位的当前时间值,所以,会打印出4个相同的时间值,如下所示:

                                       4:4:1258199615

                                       1:1:1258199615

                                       3:3:1258199615

                                       1:2:1258199615


  请修改代码,如果有几个线程调用TestDo.doSometing(key,value)方法时,传递进去的key相等(equals比较为true),则这几个线程应互斥排除输出结果,即当两个线程的key都是"1"时,它们中的一个要比另外其他线程晚1秒输出结果,如下所示:

                                       4:4:1258199615

                                       1:1:1258199615

                                       3:3:1258199615

                                       1:2:1258199616


package com.read;


//空中面试题3
public class Text3 extends Thread
{
	private TestDo testDo;
	private String key;
	private String value;
	
	public Text3(String key1,String key2,String value)
	{
		this.testDo=TestDo.getInstance();
		this.key=key1+key2;
		this.value=value;
	}
	
	public static void main(String[] args)
	{
		Text3 a = new Text3("1","","1");
		Text3 b = new Text3("1","","2");
		Text3 c = new Text3("3","","3");
		Text3 d = new Text3("4","","4");
		
		System.out.println("begin:"+(System.currentTimeMillis()/1000));
		
		a.start();
		b.start();
		c.start();
		d.start();
		
	}
	@Override
	public void run()
	{
		testDo.doSomething(key, value);
	}
	
}
class TestDo
{
	//单例模式
	private static TestDo testDo=new TestDo();
	private TestDo()
	{
		
	}
	
	public static TestDo getInstance()
	{
		return testDo;
	}
	
	public void doSomething(Object key,String value)
	{
		//需要局部同步的代码,不能改!
		{
			try
			{
				Thread.sleep(1000);
				System.out.println(key+":"+value+":"+(System.currentTimeMillis()/1000));
				
			} catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值