Mar*_*hou 6 java multithreading
我想评估Java线程功能。
我创建了一个没有线程的演示,如下所示:
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)
我用线程创建了一个演示。
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 秒,就像顺序工作一样。
为什么?
\n\n“...在第二个演示中,我创建了 5 个线程,在 5 个线程中并行运行相同的函数,我预计时间消耗与第一个项目类似,意味着接近 5 秒。...”
\n
我认为“并发”是描述“线程”进程的更好方式。
\n详细地说,程序通常以线性方式执行。
\n此线性路径称为“数据流”或“控制流”。
当程序使用线程时,多个控制流会“并行”或“同时”执行。
\n您现在可以将这条路径想象为已经分支。
因此,这里的5 个 线程将编织或“线程”在一起,同时执行它们自己的每条指令。
\n CPU时间至关重要。
总之,5 个线程实际上将花费大约5\xc3\x97更长的时间。
\n对于ThreadTest,将run方法的循环迭代除以5。
\n在此示例中,我将值从100000减少到100。
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}\nRun Code Online (Sandbox Code Playgroud)\n以下是一些比较。
\nNoThread, 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\nRun Code Online (Sandbox Code Playgroud)\n最后要注意的是,CyclicBarrier类为协同工作以产生 1 个值的线程提供缓冲区。
\n| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |