• Java Concurrent處理并發需求

    4
    Java IDE C/C++ 18213 次瀏覽
    java5開始,增加了concurrent api,用于并發處理。比如起多個線程并發從網絡上下載圖片,然后在本地顯示。
    這里寫個簡單的代碼,來說明如何使用concurrent api提供的線程連接池。
    運行結果類似這樣:
    start do 1 task …      
    >>main thread end.      
    start do 2 task …      
    start do 1 finished.      
    start do 3 task …      
    start do 2 finished.      
    start do 3 finished.
    這里的task1到task3,都做的同樣的事情,讓它所屬的線程休眠2000ms:
    private static void doSomething(int id) {      
        System.out.println("start do " + id + " task …");      
        try {      
            Thread.sleep(1000 * 2);      
        } catch (InterruptedException e) {      
            e.printStackTrace();      
        }      
        System.out.println("start do " + id + " finished.");      
    }

    如果沒有java自帶的這個api,需要自己或者使用不標準的第三方線程池api。用concurrent api寫起來很簡潔:
    public static void main(String[] args) {      
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.submit(new Runnable() {      
            @Override      
            public void run() {      
                doSomething(1);      
            }      
        });
        executorService.submit(new Runnable() {      
            @Override      
            public void run() {      
                doSomething(2);      
            }      
        });
        executorService.submit(new Runnable() {      
            @Override      
            public void run() {      
                doSomething(3);      
            }      
        });
        executorService.shutdown();      
        System.out.println(">>main thread end.");
    }
    首先,創建了一個線程池,里面有2個線程:
    ExecutorService executorService = Executors.newFixedThreadPool(2);
    然后,通過submit()方法,提交一個Runnable的實例,這個實例將交由線程池中空閑的線程執行。
    在main線程中直接運行了:
    executorService.shutdown();
    不必擔心,線程池不會直接關閉的,只有當它執行完所有提交的任務后才會關閉。如果不寫這行,在本例中,應用將不會停止,因為雖然main線程(就是運行main方法的線程,也叫主線程)退出了,但是線程池中依然有線程運行,因此應用(進程)不會退出。
    完整代碼:
    package com.easymorse.concurrent;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class Demo {
    
            /**
             * @param args
             */
            public static void main(String[] args) {
                    ExecutorService executorService = Executors.newFixedThreadPool(2);
    
                    executorService.submit(new Runnable() {
                            @Override
                            public void run() {
                                    doSomething(1);
                            }
                    });
    
                    executorService.submit(new Runnable() {
                            @Override
                            public void run() {
                                    doSomething(2);
                            }
                    });
    
                    executorService.submit(new Runnable() {
                            @Override
                            public void run() {
                                    doSomething(3);
                            }
                    });
    
                    executorService.shutdown();
                    System.out.println(">>main thread end.");
    
            }
    
            private static void doSomething(int id) {
                    System.out.println("start do " + id + " task ...");
                    try {
                            Thread.sleep(1000 * 2);
                    } catch (InterruptedException e) {
                            e.printStackTrace();
                    }
                    System.out.println("start do " + id + " finished.");
            }
    
    }

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色