天天看点

并发优于串行时间执行效率(代码实现)

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");
    }
}

           

线程数量多了之后,效率是会提高,但是不一定是成倍的提高,受到影响的因素可能很多。线程创建和销毁,也是需要时间的,线程的调度,也是需要时间的,单线程的代码编译器更好进行优化…

要执行的任务越复杂,多线程的效果就越明显。

继续阅读