多线程 19 多线程题2

package syn;

 

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

                                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(key, value);

                     }

           }

 

           class TestDo {

 

                     private TestDo() {}

                     private static TestDo _instance = new TestDo();        

                     public static TestDo getInstance() {

                                return _instance;

                     }

 

                     public void doSome(Object key, String value) {

          

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

                                {

                                          try {

                                                     Thread.sleep(1000);

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

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

                                          } catch (InterruptedException e) {

                                                     e.printStackTrace();

                                          }

                                }

                     }

 

           }

改完后:

//不能改动此Test类

public class Test3 extends Thread {

 

    private TestDo2 testDo2;

    private String key;

    private String value;

 

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

        this.testDo2 = TestDo2.getInstance();

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

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

        this.key = key + key2;

        this.value = value;

    }

 

 

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

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

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

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

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

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

        a.start();

        b.start();

        c.start();

        d.start();

 

    }

 

    public void run() {

        testDo2.doSome(key, value);

    }

 

 

}

 

class TestDo2 {

    private TestDo2() {

    }

 

    private static TestDo2 _instance = new TestDo2();

 

    public static TestDo2 getInstance() {

        return _instance;

    }

 

    private CopyOnWriteArrayList<Object> list = new CopyOnWriteArrayList<>();

 

    public void doSome(Object key, String value) {

        Object o = key;

        if (!list.contains(key)) {

            list.add(o);

        } else {

            for (Iterator iterator = list.iterator(); iterator.hasNext(); ) {

                Object oo = iterator.next();

                if (oo.equals(o)) {

                    o = oo;

                }

            }

        }

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

        synchronized (o) {

            try {

                Thread.sleep(1000);

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

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

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

如有疑问,请发邮件:[email protected]


github:??https://github.com/wangrui0/

猜你喜欢

转载自blog.csdn.net/qq_35524586/article/details/84984694
今日推荐