黑马程序员_java基础加强12_空中网题解_老师解答

原创 2012年03月30日 08:53:17

---------------------- android培训java培训、期待与您交流! ----------------------



张老师讲解答案:

1.

public class Test {

public static void main(String[] args){

        final BlockingQueue<String> queue = 

                              new ArrayBlockingQueue<String>(1);

for(int i=0;i<4;i++){

new Thread(new Runnable(){

@Override

public void run() {

while(true){

try {

String log = queue.take();

parseLog(log);

catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}).start();

}

System.out.println("begin:"+(System.currentTimeMillis()/1000));

/*模拟处理16行日志,下面的代码产生了16个日志对象,当前代码需要运行16秒才能打印完这些日志。

修改程序代码,开四个线程让这16个对象在4秒钟打完。

*/

for(int i=0;i<16;i++){  //这行代码不能改动

final String log = ""+(i+1);//这行代码不能改动

{

try {

queue.put(log);

catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

      //Test.parseLog(log);

}

}

}

//parseLog方法内部的代码不能改动

public static void parseLog(String log){

System.out.println(log+":"+(System.currentTimeMillis()/1000));

try {

Thread.sleep(1000);

catch (InterruptedException e) {

e.printStackTrace();

}

}

}

2.

public class Test1 {

public static void main(String[] args) {

final Semaphore semaphore = new Semaphore(1);

final SynchronousQueue<String> queue = 

                                   new SynchronousQueue<String>();

for(int i=0;i<10;i++){

new Thread(new Runnable(){

@Override

public void run() {

try {

semaphore.acquire();

String input = queue.take();

String output = TestDo.doSome(input);

System.out.println(Thread.currentThread().getName()+ ":" + output);

semaphore.release();

catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}).start();

}

System.out.println("begin:"+(System.currentTimeMillis()/1000));

for(int i=0;i<10;i++){  //这行不能改动

String input = i+"";  //这行不能改动

try {

queue.put(input);

catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

//不能改动此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;

}

}

3.

//不能改动此Test类

public class Test extends Thread{

private TestDo testDo;

private String key;

private String value;

public Test(String key,String key2,String value){

this.testDo = TestDo.getInstance();

/*常量"1"和"1"是同一个对象,下面这行代码就是要用"1"+""的方式产生新的对象,

以实现内容没有改变,仍然相等(都还为"1"),但对象却不再是同一个的效果*/

this.key = key+key2; 

/*a = "1"+"";   a b为同一对象

b = "1"+""

*/

this.value = value;

}

public static void main(String[] args) throws InterruptedException{

Test a = new Test("1","","1");

Test b = new Test("1","","2");

Test c = new Test("3","","3");

Test d = new Test("4","","4");

System.out.println("begin:"+(System.currentTimeMillis()/1000));

a.start();

b.start();

c.start();

d.start();

}

public void run(){

testDo.doSome(keyvalue);

}

}

class TestDo {

private TestDo() {}

private static TestDo _instance = new TestDo();

public static TestDo getInstance() {

return _instance;

}

//private ArrayList keys = new ArrayList();//多线程操作集合时,注意安全问题。

private CopyOnWriteArrayList keys = new CopyOnWriteArrayList();

public void doSome(Object key, String value) {

Object o = key;

if(!keys.contains(o)){

keys.add(o);

}else{

for(Iterator iter=keys.iterator();iter.hasNext();){

try {

Thread.sleep(20);

catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

Object oo = iter.next();

if(oo.equals(o)){

o = oo;

break;

}

}

}

synchronized(o)

// 以大括号内的是需要局部同步的代码,不能改动!

{

try {

Thread.sleep(1000);

System.out.println(key+":"+value + ":"

+ (System.currentTimeMillis() / 1000));

catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}





---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

黑马程序员_java基础加强11_空中网题解_自己做的答案

---------------------- android培训、java培训、期待与您交流! ---------------------- 空中网4k/5k月薪挑选大四实习生的...

黑马程序员——Java基础---线程的另一个总结(10)--练习,空中网面试题总结

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

黑马程序员----java编程之空中网面试题

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 第一题: 现有的程...

《黑马程序员》 空中网面试题之第一题

------- android培训、java培训、期待与您交流! ----------public class Skytest1 { /** * 第一题:现有的程序代码模拟产生了16个日志对象,...
  • xfgzss
  • xfgzss
  • 2014年04月03日 16:35
  • 589

黑马程序员---空中网面试题2

---------------------- android培训、java培训、期待与您交流! ---------------------- 第二题:现成程序中的Test类中的代码在不断地产生数据,...
  • Koccu
  • Koccu
  • 2012年07月08日 09:11
  • 1382

黑马程序员_多线程(5) 同步工具类&空中网面试题

------- android培训、java培训、期待与您交流! ---------- 一.Semaphore 实现信号灯      可以维护当前访问自身的线程个数,并提供...
  • johese
  • johese
  • 2013年03月14日 19:35
  • 673

黑马程序员---空中网面试题3

---------------------- android培训、java培训、期待与您交流! ---------------------- 第三题:现有程序同时启动了4个线程去调用TestDo.d...
  • Koccu
  • Koccu
  • 2012年07月08日 09:14
  • 1353

黑马程序员---空中网面试题1

---------------------- android培训、java培训、期待与您交流! ---------------------- 学完jdk1.5线程新特性后 有3道空中网的面...
  • Koccu
  • Koccu
  • 2012年07月08日 09:06
  • 1377
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员_java基础加强12_空中网题解_老师解答
举报原因:
原因补充:

(最多只允许输入30个字)