天天看點

并發優于串行時間執行效率(代碼實作)

package Java0509;
public class ThreadDemo2 {
    private static long count = 100_0000_0000L;//在一個較大的整數中适當的插入一些下劃線,下劃線不具備任何意義,但是能提高代碼的可讀性。
    public static void main(String[] args) {
       // serial();//串行,大概時間28秒
       concurrency();//并發,大概時間11秒

    }

    private static void concurrency() {
        long beg = System.currentTimeMillis();//時間戳

        Thread t1 = new Thread() {
      /*匿名内部類:建立了一個沒有名字的類,隻知道這個類繼承自Thread。{}中是這個類的具體代碼,同時也會new出來一個
      * 這個類的執行個體*/

            @Override
            public void run() {
                int a = 0;
                for (long i = 0; i < count; i++) {
                    a++;
                }
            }
        };
        Thread t2 = new Thread() {
            /*匿名内部類:建立了一個沒有名字的類,隻知道這個類繼承自Thread。{}中是這個類的具體代碼,同時也會new出來一個
             * 這個類的執行個體*/

            @Override
            public void run() {
                int b = 0;
                for (long i = 0; i < count; i++) {
                    b++;
                }
            }
        };
        t1.start();
        t2.start();
        try {
            t1.join();//線程等待,讓主線程等待t1和t2執行結束,然後再繼續往下執行。
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        /*t1,t2和main線程之間都是并發執行的,調用了t1.start 和 t2.start之後,兩個新線程正在緊鑼密鼓的進行計算過程中,
        * 此時主線程仍然會繼續執行,下面的end就随之被計算了,正确的做法應該是要保證t1和t2都計算完畢,再來計算這個end的時間戳*/
        long end = System.currentTimeMillis();
        System.out.println("time: " + (end - beg) + "ms");

    }

    private static void serial() {//串行29秒
        long beg = System.currentTimeMillis();//時間戳
        int a = 0;
        for (long i = 0; i < count; i++) {
            a++;
        }
        int b = 0;
        for (long i = 0; i < count; i++) {
            b++;
        }
        long end = System.currentTimeMillis();
        System.out.println("time: " + (end - beg) + "ms");
    }
}

           

線程數量多了之後,效率是會提高,但是不一定是成倍的提高,受到影響的因素可能很多。線程建立和銷毀,也是需要時間的,線程的排程,也是需要時間的,單線程的代碼編譯器更好進行優化…

要執行的任務越複雜,多線程的效果就越明顯。

繼續閱讀