一)多线程简介
进程:进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。
文本区域存储处理器执行的代码;
数据区域存储变量和进程执行期间使用的动态分配的内存;
堆栈区域存储着活动过程调用的指令和本地变量。
每一个进程可以包含多个线程。
线程:线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程。
优点:
一、可以把占据时间长的程序中的任务放到后台去处理。
二、适用于一些需要等待的任务场景,如用户输入、文件读写和网络收发数据。
三、可使程序运行速度加快,提供访问速度。
缺点:
一、如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。
二、线程需要消耗更多的内存空间。
三、线程运行中,通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
四、线程终止时,需考虑对程序运行的影响。
线程和进程的五个阶段:新建、就绪、运行、阻塞、死亡。
新建状态:使用new关键字或Thread及其子类创建一个线程对象后,线程为新增状态。
就绪状态:当线程调用start()方法时,该线程进入就绪状态。线程处于就绪的队列中,等待JVM线程调度器调度。
运行状态:当JVM调度器调度线程时,会执行run()方法,线程处于运行状态中。运行状态的线程可以变为阻塞状态、就绪状态和死亡状态。
阻塞状态:当线程调用一些特殊方法时,如sleep(睡眠)、wait(等待)。线程失去了占用资源之后,该线程变为阻塞状态。
1)等待阻塞:运行中的线程调用wait()方法,使线程进入到等待阻塞状态。
2)同步阻塞:当线程获取synchronized同步锁失败(同步锁被其它线程占用)。
3)其他阻塞:线程调用 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
多线程Thread类中常用方法:
一)static void start(),导致此线程开始执行,使线程进入就绪状态; Java虚拟机调用此线程的run方法。
二)void run(),使线程进入运行状态,此方法不执行任何操作和返回。
三)void setName(String name),指定设置当前线程的名称,如不设置,则随机生成。
四)void setPriority(int newPriority),设置线程的优先级别,默认为5,最小为1,最大为10。
五)void setDaemon(boolean on),将此线程标记为 daemon线程或用户线程。
六)boolean isAlive(),测试这个线程是否活着。
七)void interrupt(),中断这个线程。
八)boolean isInterrupted(),测试这个线程是否中断。
九)static void yield(),暂停当前正在执行的线程对象,并执行其他线程。
十)static void sleep(long millis),使线程睡眠指定的毫秒数。
十一)void join(),等待线程死亡。
十二)static Thread currentThread(),返回对当前正在执行的线程对象的引用。
十三)void dumpStack(),将当前线程的堆栈跟踪打印到标准错误流。
Object类中常用方法:
一)void wait():使该线程处于等待状态。
二)void wait(long timeout):指定该线程等待的时间,已毫秒为单位。
三)void wait(long timeout, int nanos):指定该线程等待的时间,已毫秒+纳秒为单位。
四)void notify():唤醒正在等待对象监视器的单个线程。如果有多个线程,随机唤醒其中一个就绪状态的线程。
五)void notifyAll():唤醒正在等待对象监视器的所有线程。
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!