直接上代码 我们来看两个程序 由一个线程和两个线程运行的区别:
单线程(main):
public static void test(){ long a = 0; long b = 0; for(long i = 0; i < 10000000000l; i++){ a++; } for(long i = 0; i < 10000000000l; i++){ b++; } }
多线程(两个)
public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { long a = 0; for(long i = 0; i < 10000000000L;i++){ a++; } }); Thread t2 = new Thread(() -> { long b = 0; for(long i = 0; i < 10000000000L;i++){ b++; } }); long begin = System.currentTimeMillis(); t1.start(); t2.start(); //等待t1 t2线程都走完 再走main线程 t1.join(); t2.join(); long end = System.currentTimeMillis(); System.out.println("并发执行时间:"+(end - begin)); test(); long end2 = System.currentTimeMillis(); System.out.println("单线程执行:"+(end2-begin)); } }
通过运行结果我们可以看到,两个线程运行时的速度是一个线程运行时速度的差不多三倍
当然我们可能会有疑问:这不是有两个线程嘛,时间咋不是单线程的一半呢
这个问题就涉及到线程的并行和并发的概念
并行:针对于多核cpu,多个处理器能处理多个任务,在物理层面上做到真正的同时进行
并发:针对于单核cpu,单个处理器处理任务,只是由于处理的速度很快,任务好像是同时进行的,其实并不是,只是单个任务在一个时间段内同时进行
了解了这个概念之后,我们就可以回到上面的问题了
所以只有当这两个线程分布在两个cpu上并行执行时,时间才刚好是一半
但是谁能保证只有这段时间内只有并行没有并发呢,所以这个时间就故摸不定了(既有并行,也有并发)
多线程的意义:
多线程在cpu密集型任务时,具有十分大的作用,可以高效地提高程序运行效率,因为可以充分地利用cpu资源,提高程序地运行效率
但这意味着多线程一定就能提高效率吗?
显然过于绝对,多线程是否能提高效率,和下面因素息息相关
1.是否是多核cpu(现在基本上都是多核)
2.现在的cpu核心是否处于空闲状态,如果cpu都已经满载了,这时候你开再多线程也没用