进程和线程

来源:互联网 发布:王者荣耀网络延迟460 编辑:程序博客网 时间:2024/05/17 05:07

进程(process):

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是一个可执行的实体。

进程是系统进行资源分配和调度的一个独立动态执行单位。

进程是一块包含了某些资源的内存区域,拥有私有的虚拟内存地址空间,该空间只能被它所包含的线程访问。

一个操作系统中可以运行多个任务,每一个任务即是一个进程。

一个进程可以包含多个线程。


线程(Thread):

线程是进程的一个顺序执行流。

线程本身有一个供程序执行的堆栈。

多个同类的线程共享一块内存空间和一组系统资源

线程也叫轻负荷进程。

通常情况下,线程是独立运行和独立调度的基本单位,进程是分配资源的基本单位。

每个独立的线程都有一个程序运行入口,顺序执行序列和程序的出口。


进程和线程的区别:

a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信,需要进程同步和互斥手段的辅助,以保证数据的一致性。

c.调度和切换:线程上下文切换比进程上下文切换要快得多。

d.在多线程OS中,进程不是一个可执行的实体。

e.进程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程控制


并发:线程换个进程是并发执行的。OS就爱那个时间划分为若干个时间片段,尽可能均匀的分配给每一个任务,被分配 时间片段后,任务就有机会被CPU所执行。从微观上来看,每个任务都是走走停停的,但从宏观上来看,所有任务都是同时运行的,这种现象称之为并发。在绝对意义上并不是同时发生的。

 

线程调度:分配CPU的时间片段给不同的线程,得到时间片段的线程被CPU运行,其他线程等待。线程的调度会尽可能均匀的分配时间片段给不同的线程。


线程类(Thread)有2个方法

void  strat():将线程纳入线程调度,这时线程进入Runnable状态,等待线程调度分配时间片段。当线程调度分配了时间片段,线程的run()方法开始执行。在run()执行期间,该线程处于走走停停的状态,直到run()执行完毕,线程被回收。

void  run():执行线程。


线程的状态:

new——>Runnable(可运行状态)——>Running(运行状态)——>Dead(结束)

Running——>Blocked(阻塞状态)——>Runnable

阻塞状态分为:wait():等待条件满足、sleep():睡眠、join():等待线程结束


线程的创建:

一、继承自Thread(),重写run()方法,在run()方法中我们定义需要并发执行的操作。

二、实现Runnable接口,重写run()方法,可以将线程和执行的逻辑分离开,可以实现线程的重复调用。我们需要将Runnable的实例传入线程并启动线程。

三、使用匿名内部类的形式创建只需一个实例的线程


获取线程信息的方法:

Thread  currentThread():静态方法,用于获取当前运行代码片段的线程

long  getId():用于获取线程的标识符,通常由系统分配

String  getName():获取线程的名字,通常由系统指定。格式为:Thread-X,但main()方法的线程名为main

int  getPriority():获取线程的优先级

Thread.state  getState():获取线程的状态

boolean  isAlive():测试线程是否处于活动状态

boolean  isDaemon():测试线程是否为守护线程(即后台线程)

boolean  isInterrupted():测试线程是否已经中断


优先级:1-10级,1级最低,10级最高

通常情况下,优先级越高,线程调度分配的时间分段次数越多

Thread.MIN_PRIORITY:线程的最低优先级

Thread.MAX_PRIORITY:线程的最高优先级

Thread.NORM_PRIORITY:线程的默认优先级


void  setPriority(int  priority):设置线程的优先级


守护线程:又称后台线程,当进程中只剩下守护线程时,所有的守护线程将强制终止。

main()方法是一个前台进程,一般最先结束。GC就是运行在一个后台线程上。


void  setDaemon(boolean  d):将线程设置为后台线程。当d为true时,表示设置为后台线程。后台线程应当在start()之前调用。


static  void sleep(long  ms):是当前线程进入阻塞状态ms毫秒

当线程被阻塞ms毫秒后,当前线程重新进入Runnable状态,等待线程调度分配时间片段。应当捕获该方法声明的InterruptException异常。休眠状态不释放对象锁。


static void  yield():是当前线程主动让出当次的CPU时间片段,回到Runnable状态重新等待执行。


void  join():用于等待当前线程结束,是线程同步。应捕获抛出的InterruptException异常


void  interrupt():打断/唤醒进程。

0 0