java多线程技能

进程和多线程

进程:程序的一次执行实例,正在执行的程序等。(每个进程都有自己是状态,每个进程都有自己的虚拟地址空间 ,进程是操作系统分配资源的基本单位 )
线程:线程是客户端/应用中的单位,是进程的执行路径。一个进程可以拥有多个线程。 多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存)。

使用多线程

1.创建线程的方式
继承Thread类,重写run(),创建线程实例后调用start()启动
实现Runnable接口,重写run(),创建线程实例后调用start()启动
区别:使用第一种具有局限性,java是单继承的,使用第二种可以间接的实现“多继承”
注意:执行start()的顺序并不代表执行run()的顺序

2.使用常见命令分析线程
1)在jdk的bin目录下打开命令窗口,输入jps命令可以查看线程,再输入jstack -l (线程id) 可查看线程状态
2)通过jmc.exe查看线程信息与状态
3)使用jvisualvm.exe查看线程信息(无法查看状态)

基础常用方法

currentThread():返回代码段正在被哪个线程调用 如 Thread.currentThread().getName()
isAlive():判断当前线程是否存活
sleep(long millis):在指定的时间内让当前正在执行的线程休眠
sleep(long millis, int nanos):在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠
getId():获取线程的唯一标识

停止线程

java中有三种方法可以使正在运行的线程退出:
1)使用退出标志使线程正常退出
2)使用stop()强制终止线程,此方法已作废,使用它可能会出现不可预料的结果
3)使用interrupt()方法中断线程

判断线程是否为停止状态
Thread提供了两个方法:
interrupted() : 测试currentThread()是否已经中断
isInterrupted():测试this所在类的对象是否已经中断
注意:使用interrupted()第一次进行判断后会将线程状态清除,之后调用就为false,使用isInterrupted()不会清除状态

线程停止
异常法:判断是否处于停止状态,是则进入catch并结束
使用“return”:进行判断后,return

暂停线程

在java多线程中可以使用suspend()暂停线程,使用resume()方法来恢复线程的执行
缺点:1)使用不当的话,极易造成公共资源被独占,其他线程无法访问公共同步对象的结果
2)容易出现线程突然暂停,导致数据不完整的情况

yield()方法:放弃当前cpu资源,让其他应用去占用cpu时间,放弃的时间并不确定,可能刚刚放弃马上又获得了资源

线程的优先级

线程可以划分优先级,让优先级高的线程获得更多的cpu时间片
在java中线程的优先级分为1–10(不在该范围会抛出异常)

线程优先级具有继承性:例如A线程启动B线程,则B线程与A线程的优先级是一致的
线程优先级具有规律性:高优先级大部分先于低优先级部分完成,但也可能出现低优先级先完成
线程优先级具有随机性:例如两个优先级相近的线程(5,6),高优先级的线程不一定总先执行完
线程优先级对运行速度有影响:一般而言,高优先级的线程运行的会更快一些

守护线程

java中有两种线程:一种是非守护线程,另一种就是守护线程

守护线程是一种特殊的线程,当非守护线程不存在的时间它也就不存在了。
典型的守护线程—垃圾回收线程,当进程中没有非守护线程了,也就不需要垃圾回收了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值