線程等待調用小案例

需求設置是個線程只有一個線程執行完畢後下一個線程纔會執行。

public class DataCollection {
	//設置執行順序 
    public static final LinkedList<Control> CONTROLS  = new LinkedList<>();
    public static void main(String[] args) {
        List<Thread> list = new ArrayList<>();
        Arrays.asList("m1", "m2", "m3", "m4", "m5", "m6", "m7", "m8", "m9", "m10").stream().
                map(DataCollection::creatThread).forEach(name -> {
            name.start();
            list.add(name);
        });
        list.forEach(n -> {
            try {
              // 線程等待,只有全部的線程執行完畢纔會執行下面的
                n.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        //放置空指針的操作
        Optional.of("所有的程序已經執行完畢").ifPresent(System.out::println);
    }
    private static Thread creatThread(String name) {
        return new Thread(()->{
            synchronized (CONTROLS){
                while (CONTROLS.size() > 5){
                    try {
                        CONTROLS.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                CONTROLS.addLast(new Control());
            }
            try {
                Optional.of("the work " + Thread.currentThread().getName() + "working....").ifPresent(System.out::println);
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (CONTROLS){
                Optional.of("the work"+Thread.currentThread().getName()+"end").ifPresent(System.out::println);
                CONTROLS.removeFirst();
                CONTROLS.notifyAll();
            }
        },name);
    }
    private  static  class Control{
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章