为什么带线和不带线没有明显区别?

Mar*_*hou 6 java multithreading

我想评估Java线程功能。

  1. 我创建了一个没有线程的演示,如下所示:

    import java.util.*;
    
    public class NoThread {
    
        public static void main(String[] args) {
            NoThread Obj= new NoThread();   
            Date BeforeDate = new Date();
    
            Obj.run();
    
            Date AfterDate = new Date();
            Double Time_Consume = (AfterDate.getTime()- BeforeDate.getTime())/1000.0;
    
            System.out.println("Time Consume= " + Time_Consume + " Seconds"  );
        }
    
        public void run() {
            String tmp = "";
            for (int i = 0; i < 100000; i++) {
                tmp += i;
            }   
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
    Cons
    
    ole display: Time Consume= 4.771 Seconds
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我用线程创建了一个演示。

    import java.util.Date;
    
    public class ThreadTest extends Thread
    {
        public static void main(String[] args) {
            ThreadTest[ ] ObjArray = new ThreadTest[5];     
    
            for(int i=0;i<5;i++)
                ObjArray[i]= new ThreadTest();
    
                Date BeforeDate = new Date();
    
                for(int i=0; i<5;i++ )
                {
                    ObjArray[i].start();  
                }
    
                try
                {
                    for(int i=0; i<5;i++ )
                        ObjArray[i].join();
                }
                catch(InterruptedException e)
                {
                }
    
                Date AfterDate = new Date();          
                Double Time_Consume = (AfterDate.getTime()- BeforeDate.getTime())/1000.0;
                System.out.println("Time Consume= " + Time_Consume + " Seconds"  );
        }
    
        public void run() {
            String tmp = "";
            for (int i = 0; i < 100000; i++) {
                tmp += i;
            }   
        }   
    }
    
    Run Code Online (Sandbox Code Playgroud)
    Time Consume= 18.658 Seconds
    
    Run Code Online (Sandbox Code Playgroud)

在第二个演示中,我创建了五个线程,在五个线程中并行运行相同的函数。我预计时间消耗与第一个项目类似,这意味着接近五秒。

然而,它比我的预期要高得多,它更接近于 5(运行时间)* 4.771 = 23.85 秒,就像顺序工作一样。

为什么?

Rei*_*las 0

\n

“...在第二个演示中,我创建了 5 个线程,在 5 个线程中并行运行相同的函数,我预计时间消耗与第一个项目类似,意味着接近 5 秒。...”

\n
\n

我认为“并发”是描述“线程”进程的更好方式。

\n

详细地说,程序通常以线性方式执行。
\n此线性路径称为“数据流”控制流

\n

当程序使用线程时,多个控制流会“并行”“同时”执行。
\n您现在可以将这条路径想象为已经分支。

\n

因此,这里的5 个 线程将编织或“线程”在一起,同时执行它们自己的每条指令。
\n CPU时间至关重要。

\n

总之,5 个线程实际上将花费大约5\xc3\x97更长的时间。

\n

对于ThreadTest,将run方法的循环迭代除以5
\n在此示例中,我将值从100000减少到100

\n
class ThreadTest extends Thread\n{\n    int i, limit;\n\n    public static void main(String[] args) throws BrokenBarrierException, InterruptedException {\n        // TODO Auto-generated method stub\n\n        ThreadTest[ ] ObjArray = new ThreadTest[5];\n\n        int n = 100 / 5;\n        for(int i=0;i<5;i++)\n            ObjArray[i]= new ThreadTest(n * i, (n * i) + n);\n\n        Date BeforeDate = new Date();\n\n        for(int i=0; i<5;i++ )\n        {\n            ObjArray[i].start();\n        }\n\n        try\n        {\n\n            for(int i=0; i<5;i++ )\n                ObjArray[i].join();\n\n        }\n        catch(InterruptedException e)\n        {\n\n        }\n\n\n        Date AfterDate = new Date();\n        Double Time_Consume = (AfterDate.getTime()- BeforeDate.getTime())/1000.0;\n        System.out.println("Time Consume= " + Time_Consume + " Seconds"  );\n\n\n\n    }\n\n    ThreadTest(int i, int limit) {\n        this.i = i;\n        this.limit = limit;\n    }\n\n    public void run() {\n        String tmp = "";\n        for (int i = this.i; i <= limit; i++) {\n            tmp += i;\n        }\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

以下是一些比较。

\n
NoThread, Time Consume= 0.046 Seconds\nThreadTest, Time Consume= 0.054 Seconds\n\nNoThread, Time Consume= 0.027 Seconds\nThreadTest Time Consume= 0.029 Seconds\n\nNoThread, Time Consume= 0.03 Seconds\nThreadTest, Time Consume= 0.022 Seconds\n
Run Code Online (Sandbox Code Playgroud)\n

最后要注意的是,CyclicBarrier类为协同工作以产生 1 个值的线程提供缓冲区。

\n