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();
}
}
}
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;
}
}
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();
}
}
}
}
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();
}
}
}
}