多线程概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。其实平时我们启动程序,其实是启动的进程,但是在往下细分的话,其实是进程的一个或者多个线程完成的功能。
主线程:当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(Main Thread)。每个进程至少都有一个主线程,主线程通常最后关闭。
子线程:在程序中创建的其他线程,相对于主线程来说就是这个主线程的子线程。
并行:任务数小于或等于cpu的核数,是真正意义上一起执行
并发:任务数大于cpu核数,多个任务交替执行
线程执行的时候是无序的,由cpu调度决定的
线程执行过程中,主线程会等待所有子线程执行完成用户程序再退出
好处 :(1)易于调度。
(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
(3)开销少。创建线程比创建进程要快,所需开销很少。
(4)利于充分发挥多处理器的功能。通过创建多线程进程,每个线程在一个处理器上运行,从而实现应用程序的并发性,
使每个处理器都得到充分运行。
线程的生命周期
各个状态的说明如下:
1.new新建。新创建的线程经过初始化后,进入Runnable状态。
2.Runnable就绪。等待线程调度。调度后进入运行状态。
3.Running运行。
4.Blocked阻塞,暂停运行,解除阻塞后进入Runnable状态重新等待调度。
5.Dead消亡。线程方法执行完毕返回或者异常终止。
可能有3种情况从Running进入Blocked:
同步:线程中获取同步锁,但是资源已经被其他线程锁定时,进入Locked状态,直到该资源可获取(获取的顺序由Lock队列控制)
睡眠:线程运行sleep()或join()方法后,线程进入Sleeping状态。区别在于sleep等待固定的时间,而join是等待子线程执行完。当然join也可以指定一个“超时时间”。从语义上来说,如果两个线程a,b, 在a中调用b.join(),相当于合并(join)成一个线程。最常见的情况是在主线程中join所有的子线程。
等待:线程中执行wait()方法后,线程进入Waiting状态,等待其他线程的通知(notify)