一 进程和多线程简介
线程
与进程相似,比进程更小执行单位。进程执行中可产生多个线程。
一个处理器只能一个线程(同一时间点,多核也不行)。多个处理器才能多线程。
进程
执行中的程序,系统运行程序基本单位,在计算机中一个指令接一个指令执行,占CPU时间,内存空间,文件,文件,输入输出设备使用权等。换句话说,程序执行时,会被操作系统载入内存中。
不同
独立:进程是独立的,同一进程中的线程极有可能相互影响。
共享:同类多线程共享内存或系统资源,线程间切换,比进程小得多,轻量级
执行范围:1)进程:同时执行一个以上程序,2)线程:同一程序内几乎同时执行一个以上程序段
二 使用多线程
2.1继承Thread类
线程是一个子任务,CPU随机调用线程run()
2.2实现Runnable接口
推荐,因为Java单继承, 可实现多接口
三 实例变量和线程安全
3.1 不共享数据的情况
每个线程都自己的实例变量count,互不影响
3.2 共享数据的情况
出现错误,我们想要依次递减结果。count–的操作:get原有count值、计算i -1 、赋值。加synchronized:
四 一些常用方法
4.1 currentThread() :返回对当前正在执行的线程对象的引用。
4.2 getId() 返回此线程的标识符
4.3 getName() 返回此线程的名称
4.4 getPriority() 返回此线程的优先级
4.5 isAlive() 是否还处于活动状态。(已启动尚未终止。正运行或准备运行状态)
4.6 sleep(long millis) 毫秒数“休眠”(暂时停止执行)
4.7 interrupt() 中断这个线程
4.8 interrupted():是否已中断状态,执行后有将状态标志清除为false的功能
isInterrupted(): 是否已经是中断状态,清楚状态标志
4.9 setName(String name) 更改线程名
4.10 isDaemon() 是否是守护线程。
4.11 setDaemon(boolean on) 标记为 daemon线程或用户线程。
4.12 join() :“等待该线程终止”,主等待子线程执行完成再结束,子线程调用join()方法后代码
4.13 yield() 放弃当前的CPU资源,它让其他的任务去占用CPU时间。注意:放弃的时间不确定,可能一会就会重新获得CPU时间片。
4.14 setPriority(int newPriority) 改线程优先级
五 如何停止一个线程呢?
5.1 interrupt()
运行上发现并不终止。改进:interrupted()方法判断线程是否停止,如果是停止状态则break
循环虽停止,但下面仍执行,说明线程并未被停止
5.2 return停止线程
stop(),suspend(),resume()(仅用于与suspend()一起使用)已被弃用
六 线程的优先级
就绪状态,优先级决定先运行,gc线程优先级低
继承性:A启动B线程,AB优先级一样
随机性:高的不一定先执行完。
Thread.MIN_PRIORITY(常数1) 到Thread.MAX_PRIORITY(常数10) 之间,在默认情况下优先级都是Thread.NORM_PRIORITY(常数5)。
七 Java多线程分类
用户线程:前台运行,执行具体任务,如程序的主线程、连接网络的子线程等都是用户线程
守护线程:后台运行,为其他前台线程服务.JVM中非守护线程 “佣人”,随JVM一起结束,如:数据库连接池、JVM启动后、GC的检测线程
7.2 设置守护线程?
setDaemon(true)
1. 在start()方法前执行,否则会抛出IllegalThreadStateException异常
2. 产生新线程也是守护线程
3. 读写操作或计算逻辑,不可以分给守护线程
运行结果: