进程线程
进程
目前的操作系统是一种能够支持多任务的系统,比如在一台电脑可以同时运行很多个应用程序(比如:qq,微信,ppt,eclipse,typora),这每一个应用程序可以认为是一个正在执行的任务,比如在使用eclipse编写代码时还可以同时打开播放器听音乐,以及开启笔记工具记笔记,就目前的多核操作系统来说可以支持这些任务的同步运行;当然在单核时代,操作系统也是可以支持多个任务“同时”运行,实际运行方式是:在同一个时间片应用程序只得到了为数不多了执行时间,CUP在多个任务之间快速的切换,以至于用户跟本看不出是系统是单任务的。进程是计算机中应用程序的基本单元。
线程
一个进程中可以包含多个子任务同时运行,比如:在使用360安全卫士进行全盘扫描时,后台可以同步更新病毒库,同时检测正在运行的其他程序;其中的每一个子任务都称之为一条线程,因此,进程中至少包含一个线程,即线程是进程中的一条执行路径。
线程状态
每一条线程都有各自的生命周期,并且线程对象都存在以下几种状态:
- 初始:线程刚创建时候的状态
- 就绪:当线程准备运行时候的状态
- 运行:当CPU分配时间片给当前线程,线程进入运行态
- 阻塞:当CPU将时间片从当前线程分配到其他线程时,当前线程进入阻塞态
- 销毁:当线程执行完毕后销毁
线程的创建与启动
java中提供对线程的支持,java中创建线程包含四种方式,其中有两种是基本的创建方式,另外两种是在JDK1.5之后新增的并发编程包中,如下:
- 实现Runnable接口
- 继承Thread类
- 实现Callable接口,创建FutureTask
- 使用ExecutorService,Callable等相关接口
Thread类详解
Thread类是java.lang包中用于创建线程对象的类,JVM允许同时运行多个Thread对象,Thread类从Runnable实现,因此Thread类中也对run方法做了实现,通常需要创建自定义线程时,一般需要重写run方法;Thread类中提供了一个常用构造器和方法用于操作线程对象:
- 常见构造器:
- Thread()
- Thread(String name)
- Thread(Runnable r)
- Thread(Runnable r,String name)
- 常见方法
- static int activeCount() 获取活动线程数(包含主线程)
- static Thread currentThread() 获取当前线程对象
- long getId() 获取线程的标识符
- String getName() 获取线程名称
- getPriority() 获取线程优先级(1-10)
- setPriority(int p)设置线程优先级(MAX_PRIORITY、NORM_PRIORITY、MIN_PRIORITY)
- interrupt() 中断线程对象(并非真正中断,实际是添加中断标记)
- isInterrupted() 判断线程是否中断
- sleep(long time) 让休眠指定毫秒,时间到达会自动唤醒
线程终止
线程在运行过程中可能由于满足到一些特定条件后需要中断当前线程,因此,如何安全有效的终止线程的运行就成为一个比较重要的问题了,java多线程编程中,线程的中断包含以下几种方式:
- 标记中断法
- 异常中断法
守护线程
守护线程也称之为后台线程,守护线程的主要作用于为其他线程提供服务,当守护线程守护的主线程结束后,守护线程也将结束(皮之不存毛将焉附),比如,文件下载时,一条主线程实现文件拷贝,另一条子线程用于计算下载进度,该条子线程主要为下载线程提供服务,因此计算下载进度的线程可以定义为守护线程;只需要调用Thread类提供的setDaemon()方法即可实现,java中要将其他线程设置为守护线程。