1.进程
在一个操作系统中,每个独立执行的程序都可以称为一个进程,也就是“正在运行的程序”,例如同时运行的QQ,微信,酷狗音乐,360安全卫士等。
在多任务的操作系统中(即能同时执行多个引用程序),可以查看当前系统中的进程,如windows操作系统在任务管理器中就可以查看。。
在多任务的操作系统中,表面上看是支持进程并发执行的,例如一边听音乐一边打游戏,但是实际上这些进程并不是在同一时刻运行的。在计算机中,所有的应用程序都是由CPU执行的,对于一个CPU而言,在某个时间点只能运行一个程序,即只能运行一个进程。操作系统会为每一个进程分配一段有限的CPU使用时间,CPU在这段时间中执行某个进程,然后在下一段时间切换到另一个进程中去执行。由于CPU的运行速度非常快,能在极短的时间中在不同的进程之间可以切换,所以给人以同时执行多个程序的感觉。。。。
进程调度的方式有:时间片轮转调度算法(RR),先来先服务调度算法(FCFS)等。
2.线程
在多任务操作系统中,每个运行的程序是一个进程,用来执行不同的任务,而在进程中还可以有多个执行单元同时运行,来同时完成一个或多个程序任务,这些执行单元可以看作程序执行的一条条线索,被称为线程。。
操作系统中的每一个进程中至少存在一个线程。
当一个Java程序启动时,就会产生一个进程,该进程中会默认创建一个线程,在这个线程上会运行main()方法中的代码。。。
2.1 单线程
在前面写的程序中,代码都是按照调用顺序依次往下执行,没有出现多线程代码交替运行的效果,这样的程序称作单线程程序。。
2.2 多线程
实现程序中多段代码间交替运行,需要创建多个线程。即为多线程程序。
多线程程序在运行时,每个线程之间都是独立的,它们可以并发执行。
多线程是并发执行的多条线索,这样就可以充分利用CPU资源,进一步提高程序执行效率。
注:多线程看似是同时并发执行的,其实不然,它们和进程一样,也是由CPU控制并轮流执行的,只不过CPU的速度非常块,因此给人同时执行的感觉。
2.3 线程调度的方法
协同式线程调度(Cooperative Threads-Scheduling): 如果使用协同式调度的多线程系统,线程的执行时间由线程本身控制,线程把自己的工作执行完成之后,要主动通知系统切换到另外一个线程上。
-
优点:实现简单,切换操作对线程自己是可知的,所以没有什么线程同步的问题。
-
缺点:线程执行时间不可控,甚至如果一个线程编写有问题,一直不通知系统进行线程切换,那么程序会一直阻塞。
抢占式线程调度(Preemptive Threads-Scheduling): 如果使用抢占式调度的多线程系统,那么每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定。
-
优点:线程的执行时间是系统可控的,也不会有一个线程导致整个进程阻塞的问题。
-
缺点:想要获取执行时间的话,线程本身是没有什么办法的。
Java使用的线程调度方式就是抢占式线程调度。