- 如何使用多线程
- 如何得到多线程的一些信息
- 如何停止线程
- 如何暂停线程
- 线程的一些其他用法
所有的代码均可以在char01
如何使用多线程
启动线程的两种方式
Java 提供了2种方式来使用多线程, 一种是编写一个类来继承Thread,然后覆写run方法,然后调用start方法来启动线程。这时这个类就会以另一个线程的方式来运行run方法里面的代码。另一种是编写一个类来实现Runnable接口,然后实现java基础知识 线程接口方法,然后创造一个Thread对象,把实现了Runnable接口的类当做构造参数,传入Thread对象,最后该Thread对象调用start方法。
这里的start方法是一个有启动功能的方法,该方法内部回调run方法。所以,只有调用了start方法才会启动另一个线程,直接调用run方法,还是在同一个线程中执行run,而不是在另一个线程执行run
此外,start方法只是告诉虚拟机,该线程可以启动了,也就说该线程在就绪的状态,但不代表调用start就立即运行了,这要等待JVM来决定什么时候执行这个线程。也就是说,如果有两个线程A,B ,A先调用start,B后调用start,不代表A线程先运行,B线程后运行。这都是由JVM决定了,可以认为是随机启动。
下面我们用实际的代码,来说明两种启动线程的方式:
第一种,继承Thread
测试的代码可以看test目录下的类。
如何得到多线程的一些信息
我们在启动多线程之后,希望能通过一些API得到启动的线程的一些信息。JDK给我们提供了一个Thread类的方法来得到线程的一些信息。
- 线程的名字 ——
- 线程的ID ——
- 线程是否存活 ——
得到线程的名字
这些方法是属于Thread的内部方法,所以我们可以用两种方式调用这些方法,一个是我们的类继承Thread来使用多线程的时候,可以用过this来调用。另一种是通过 来调用这些方法。但是这两个方法在不同的使用场景下是有区别的。
我们先简单来看两个方法的使用。
第一个的使用,代码如下:
测试的代码如下:
结果如下:
测试代码如下:
结果如下:
得到线程的ID
判断线程是否存活
测试方法如下:
结果如下:
我们可以发现在start之前,该线程被认为是没有存活,然后run的时候,是存活的,等run方法执行完,又被认为是不存活的。
如何停止线程
判断线程是否终止
JDK提供了一些方法来判断线程是否终止 ——
停止线程的方式
这个是得到线程信息中比较重要的一个方法了,因为这个和终止线程的方法相关联。先说一下终止线程的几种方式:
- 等待run方法执行完
- 线程对象调用stop()
- 线程对象调用interrupt(),在该线程的run方法中判断是否终止,抛出一个终止异常终止。
- 线程对象调用interrupt(),在该线程的run方法中判断是否终止,以return语句结束。
第一种就不说了,第二种stop()方法已经废弃了,因为可能会产生如下原因:
- 强制结束线程,该线程应该做的清理工作,无法完成。
- 强制结束线程,该线程已操作的加锁对象强制解锁,造成数据不一致。
具体的例子可以看以及他的测试类
测试的代码如下:
如何暂停线程
在JDK中提供了以下两个方法用来暂停线程和恢复线程。
- suspend()——暂停线程
- resume()——恢复线程
这两个方法和stop方法一样是被废弃的方法,其用法和stop一样,暴力的暂停线程和恢复线程。这两个方法之所以是废弃的主要由以下两个原因:
- 线程持有锁定的公共资源的情况下,一旦被暂停,则公共资源无法被其他线程所持有。
- 线程强制暂停,导致该线程执行的操作没有执行完全,这时访问该线程的数据会出现数据不一致。
线程的一些其他用法
线程的其他的一些基础用法如下:
- 线程让步
- 设置线程的优先级
- 守护线程
线程让步
设置线程的优先级
我们可以设置线程的优先级来让CPU尽可能的将执行的资源给优先级高的线程。Java设置了1-10这10个优先级,又有三个静态变量来提供三个优先级:
下面说一下优先级的一些规则:
- 优先级高的线程一般会比优先级低的线程获得更多的CPU资源,但是不代表优先级高的任务一定先于优先级低的任务先执行完。因为不同优先级的线程中run方法内容可能不一样。
- 优先级高的线程一定会比优先级低的线程执行的快。如果两个线程是一样的run方法,但是优先级不一样,确实优先级高的线程先执行完。
线程守护
总结
null版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/25783.html