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

---------------------- 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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值