并发与并行
-
并发与并行
并发:在一个时间段中有几个程序都处于已启动运行到运行结束之中,且这几个程序都是在同一个处理机上运行,但在任意一个时刻点只有一个程序在运行
并行:两个或以上的程序同时在不同的处理器上处理。互相不抢夺CPU资源。 -
两者区别
并行是两个或以上的程序同时进行,并发是指两个或者在同一个时间间隔内发生。意思为:当多个处理器机器上,多个应用程序可以并发在分配到多个处理器上,实现并行执行。
线程、进程 -
线程的实现,状态
各线程根据优先级轮流获得CPU的调度权。线程的调度由JVM进行。在运行池中有多个就绪的线程等待CPU。
状态:
新建状态(NEW),未启动;
就绪状态(Runnable),调用了Start方法,已经运行,等待获取系统资源;
堵塞状态(Blocked),线程等待锁的状态;
限期等待状态(waiting),等待另一个线程以执行特点的操作,Object.wait(),Thread,join(),LockSupport.park,会进入限期等待状态;
无限期线程等待状态(TIMED_WAITING)(Sleep会进入,不会释放锁,带参数的Object.wait(),Thread,join(),LockSupport.parkNanos, ,LockSupport.parkUntil);
线程结束状态(Terminated)。 -
优先级:
当线程的优先级没有指定时,所有线程都携带普通优先级。
优先级可以用从1到10的范围指定。10表示最高优先级,1表示最低优先级,5是普通优先级。
优先级最高的线程在执行时被给予优先。但是不能保证线程在启动时就进入运行状态。
与在线程池中等待运行机会的线程相比,当前正在运行的线程可能总是拥有更高的优先级。
由调度程序决定哪一个线程被执行。
t.setPriority()用来设定线程的优先级。
在线程开始方法被调用之前,线程的优先级应该被设定。
可以使用常量,如MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY来设定优先级。 -
线程调度
协同调度:线程执行的时间由线程本身决定,线程主动通知系统切换为另一个系统,优点为无线程同步问题,缺点为线程执行时间未知,容易阻塞。
抢占式调度:由系统分配执行时间,切换由系统决定,优点为可控制执行时间,JVM主要方法。 -
创建线程的方式
继承Thread类创建线程,重写Run()方法,并调用Start()
实现Runnable接口,重写Run()方法,创建接口实例,调用Start()
使用Callable和Future创建线程:创建Callable接口实现类,实现Call()方法,并创建实例,通过FutureTask类包装Callable对象,封装Call()返回值,使用FutureTask对象作为Thread对象的target创建线程(主要还是因为FutureTask实现了Runnable),调用get()获取结束后返回值。
线程池:Executor -
守护线程,进程
守护线程:在程序运行的时候在后天提供一种通用服务:垃圾回收;这种线程不属于不可或缺,当所有非守护进程终止后,会终止所有的守护进程,程序终止。不能把正常运行的常规线程设置为守护线程。
进程:并发执行的程序在执行过程中分配和管理资源的基本单位。线程属于进程的一部分,是CPU的基本调度单位。