多線程練習

要求:
(1)自定義容器,提供新增元素(add)和獲取元素數量(size)的方法。
(2)啟動兩個線程。線程1向容器中新增10個數據。線程2監聽容器元素數量,當容器元素數量為5時,線程2輸出信息并終止。

方式一:

public class Test1 {
    public static void main(String[] args) {
        Test1_Container t = new Test1_Container();
        new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("add Object to Container " + i);
                    t.add(new Object());
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                while (true) {
                    if (t.size() == 5) {
                        System.out.println("Container's size = 5");
                        break;
                    }
                }
            }
        }).start();
    }
}

class Test1_Container {
    volatile List<Object> container = new ArrayList<>();

    public void add(Object o) {
        this.container.add(o);
    }

    public int size() {
        return container.size();
    }
}

方式二:

public class Test2 {
    public static void main(String[] args) {
        final Test2_Container t = new Test2_Container();
        final Object lock = new Object();

        new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {
                    if (t.size() != 5) {
                        try {
                            lock.wait(); // 線程進入等待隊列。
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("size = 5");
                    lock.notifyAll(); // 喚醒其他等待線程
                }
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {
                    for (int i = 0; i < 10; i++) {
                        System.out.println("add Object to Container " + i);
                        t.add(new Object());
                        if (t.size() == 5) {
                            lock.notifyAll();
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        try {
                            TimeUnit.SECONDS.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();
    }
}

class Test2_Container {
    List<Object> container = new ArrayList<>();

    public void add(Object o) {
        this.container.add(o);
    }

    public int size() {
        return container.size();
    }
}

方式三:

public class Test3 {
    public static void main(String[] args) {
        Test3_Container t = new Test3_Container();
        CountDownLatch latch = new CountDownLatch(1);// 門閂

        new Thread(new Runnable() {
            public void run() {
                if (t.size() != 5) {
                    try {
                        latch.await();// 等待門閂開啟,不是進入等待隊列
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("size = 5");
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("add Object to Container " + i);
                    t.add(new Object());
                    if (t.size() == 5) {
                        latch.countDown();// 門閂-1
                    }
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

class Test3_Container {
    List<Object> container = new ArrayList<>();

    public void add(Object o) {
        this.container.add(o);
    }

    public int size() {
        return container.size();
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本文是我自己在秋招復習時的讀書筆記,整理的知識點,也是為了防止忘記,尊重勞動成果,轉載注明出處哦!如果你也喜歡,那...
    波波波先森閱讀 11,315評論 4 56
  • 幾個月下來一直在沉淀,在扎根,也算是不放過每一個學習的機會,在老師的言傳身教下,在同修的你追我趕下,最近發現自己上...
    輕瑜伽閱讀 197評論 0 0
  • 花的美, 不可否認; 葉的綠, 也值得肯定; 但置身污泥濁水, 誰的錯? 先別說你多高潔, 出污泥,能不染? 看一...
    微迅閱讀 1,290評論 57 44
  • 歌微寨的西面,環著一脈連綿的云圭山。歌微寨的人們埋首耕田時,抬首面西看到的永遠是一動不動的云圭山,像被荒置的皮影,...
    收割白日夢閱讀 560評論 3 1