线程和进程

1.进程和线程分别是什么?
进程:在操作系统中运行的程序就是进程,如看视频。
线程:线程是程序更小的执行单元。一个进程中可以有多个线程,如视频中听声音,看图像,显示字幕。
进程与线程的区别:
(1)根本区别:进程是资源分配的基本单位,线程是程序调度和执行的基本单位。
(2)开销:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。

   线程可以看成轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。

(3)所处环境:在操作系统中能同时运行多个任务(程序)。
在同一应用程序中有多个顺序流同时执行。
(4)分配内存:系统在运行的时候会为每个进程分配不同的内存区域。

除了CPU之外,不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。

(5)包含关系:没有线程的进程可以被看成单线程,如果一个进程内拥有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的。

线程是进程的一部分,所以线程有时被称为轻权进程或者是轻量级进程。

2.什么是多线程?

多线程就是指一个进程中同时有多个执行路径(线程)正在执行。

3.为什么要使用多线程?

  (1)在一个程序中,有很多的操作是非常耗时的,如数据库读写操作,IO操作等,如果使用单线程,那么程序就必须等待这些操作执行完成之后才能执行其他操作。使用多线程,可以在将耗时任务放在后台继续执行的同时,同时执行其他操作。(比如在下载资源的同时还可以做其他操作)

  (2)可以提高程序的效率。

  (3)在一些等待的任务上,如用户输入,文件读取等,多线程就非常有用了。

4.实现多线程的方法:

(1)继承Thread类,重写run()方法,继承了Thread类,就不能继承其他类了:
(2)实现Runnable接口,重写run()方法,没有返回值:
 
(3)实现Callable接口,重写call()方法,有返回值,可以抛出异常:

5.线程的五大状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态。

注意:(1)线程进入死亡状态之后不能重新开启,重新开启是新的线程。

       (2)线程进入阻塞状态之后,重新恢复的话是进入就绪状态。 

6.线程进入就绪状态的四个原因:

  (1)创建线程以后,调用start()方法;

  (2)解除阻塞,从阻塞状态恢复;

(3)调用yield()方法,结束中断,礼让线程,让当前正在执行的线程暂停,不是阻塞状态,而是将线程从运行状态转入就绪状态。

(4)JVM将CPU从本地线程切换到其他线程。 

7.线程进入阻塞状态的四种原因: 

(1)调用sleep()方法:sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态)。

(2)调用wait()方法:wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait一pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

(3)调用join()方法:阻塞指定线程等到另一个线程完成以后再继续执行。合并线程,待此线程执行完毕后,再去执行其他线程,其他线程阻塞。

(4)io操作中的read和Write。 

8.终止线程的两种方式:

(1)线程正常执行完毕:次数限制;

(2)外部干涉:加入标识。

注意:不要不使用stop和deatory终止线程,不安全。

9.什么是守护线程?

(1)线程:线程分为用户线程和守护线程。
(2)虚拟机必须等待用户线程执行完毕;
(3)虚拟机不必等待守护线程执行完毕; 
(4)守护线程是为用户线程服务的。
原文地址:https://www.cnblogs.com/liqinzhen/p/12801113.html