关闭

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

标签: javastringinputandroid多线程output
1194人阅读 评论(2) 收藏 举报
分类:

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:63440次
    • 积分:1120
    • 等级:
    • 排名:千里之外
    • 原创:49篇
    • 转载:0篇
    • 译文:0篇
    • 评论:12条
    文章存档