进程和线程
1.线程和进程的定义
进程定义:一个程序在一个数据集上的一次动态执行过程。
简单来说:
如果把进程比喻成桌子,线程比喻成人,程序比喻成吃饭。
1.单进程单线程:一个人在一个桌子上吃饭
2.单进程多线程:一堆人在一张桌子上一起吃饭
3.多进程多线程:每个人在自己的桌子上吃饭
单进程多线程的问题是:大家容易争抢,造成一些问题。
多进程多线程的问题是:各吃各的挺好,但是彼此聊天不方便。
Windows:开桌子花销大,因此鼓励大家在一个桌子上吃饭,所以Windows多线程的学习重点是解决资源争抢和同步的方法。
Linux:开桌子花销小,因此鼓励每个人在自己的桌子吃饭,但是彼此聊天不方便,所以Linux下多线程的学习重点是进程间通讯的方法。
PS:做一个实验,创建一个进程,写入若干数据、再读出数据,最后退出,重复1000次。(创建和销毁进程1000次)
Linux:0.8s
Windows:79.8s
所以Windows开桌子的效率是Linux的100倍左右.
多线程和多进程的本质区别:每一个进程拥有自己的一整套变量,而多线程则共享进程中的数据.
多线程是线程控制的简写.
2.Java中的多线程
线程可以有以下六种状态:
1.New(新创建的)
2.Runnable(可运行的)
3.Blocked(被阻塞的)
4.Waiting(等待)
5.Timed waiting(计时等待)
6.Terminated(被终止)
新建一个线程的时候,线程的状态是New。
一旦调用start方法,线程处于Runnable状态,表示可以被运行。
当操作系统给线程提供运行的时间的时候,则该线程进入运行状态。
但是,线程开始运行之后,不会一直保持运行,有的时候会被中断给其他线程提供运行机会(多线程)。这个状态一般都是Waiting或者Timed waiting状态,如果是Timed waiting状态,在计时结束后,会根据线程的优先级重新让其进入运行状态。
线程也可能因为其他线程被堵塞,进入Blocked状态(目的是同步数据,不造成数据混乱)。
有两种情况,系统会被终止,进入Terminated状态,第一种是run方法执行完毕,线程正常结束。第二种是一个没有捕获的异常终止了run方法。
PS:原来我们可能用过stop方法来终止一个线程,但是现在该方法已经被弃用,尽量不要在自己的程序中使用它。
3.线程优先级
在Java中,每一个线程都有一个优先级,默认情况下,一个线程继承他父线程的优先级,但是可以用setPriority方法提高或降低优先级,优先级在1—10之间,最高是10,最低是1.
当线程调度器暂停或结束当前线程的任务,选择新线程之行时,它首先选择具有较高优先级的线程。
不要让程序中功能的调度过分依赖于优先级,应该注意以下问题:当几个高优先级的线程没有进入非活动状态的时候,低优先级的线程永远不可能执行。
4.守护线程(daemon thread)
Java中有一种很特殊的线程,叫做守护线程,这个线程就一个用途:为其他线程提供服务,计时线程就是一个例子,它会定时发送信号给其他线程或清空过时的缓存。当一个应用程序中只剩下守护线程的时候,虚拟机就会退出,因为如果只剩下守护线程,就没必要继续运行程序了。
使用守护线程需要考虑以下的问题:永远不要使用守护线程去访问资源,如:文件、数据库,因为它可能会在任何时候中断。
设置一个线程为守护线程的方法很简单:调用线程的setDaemon方法就ok了,传递一个bool值,值得注意的是,该方法必须在线程启动前调用。
5.条件对象
原文地址:https://www.cnblogs.com/Fill/p/9359229.html