JAVA中线程(三)常用API

148 阅读3分钟

这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

前言:昨天我们已经说过了线程创建的三种方式,三种方式都和Runnable接口息息相关,其中Runnable创建线程太单一了,Callable创建线程只有一个必须返回的信息所以拓展就比较难,那么今天我们来说线程常用的API则是在Thread类的基础之上。

API展示:

image.png

currentThread():查看当前正在执行的线程。

image.png

isAlive():测试线程是否处于活动状态,线程已经启动且尚未终止就是活动状态

image.png

stop():删除线程,但容易造成业务处理的不确定性,太暴力了调用时会抛出java.lang.ThreadDeath异常,此异常不需要显式地捕捉

image.png

sleep(long millis):在指定的时间(毫秒)内让当前线程休眠,并且不会失去任何监视器的所有权,其中还有一个sleep(long millis, int nanos)方法,我们一般不用,后面则是规定多少纳秒,在计算机中毫秒已经是很快了。

image.png

dumpStack():将当前线程的堆栈信息输出至标准错误流中,此方法一般用于调试。

image.png

interrupted():判断currentThread()是否已经中断,执行后具有清除状态标志值

image.png

isInterrupted():测试某个线程是否被中断,其中使用了native修饰测试调用本地的isInterrupted()。

image.png

interrupt():停止线程。使用了synchronized修饰,可以确定线程的安全。

image.png

suspend():暂停线程。极易容易造成公共同步对象被独占,其他线程无法访问共同同步对象的结果,目前已不推荐使用。

image.png

resume():恢复线程。我们可以看到他和suspend()是相对的,在暂停后可以使用resume()进行恢复。目前已不推荐使用。

image.png

setDaemon(true):设置守护线程。

  • 我们首相要了知道有User Thread(用户线程)和Daemon Thread(守护线程),而从他两本质上来说并没有什么区别,唯一的不同之处就在于虚拟机的离开后如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了,也就是说一个公司下班了,只有一个守护线程手上有钥匙,其他的为普通员工,只有普通员工走完后,守护线程才可以关门然后自己也离开公司。

image.png

StackTraceElement[] getStackTrace():返回一个表示该线程堆栈跟踪元素数组返回的第一个元素代表堆栈顶,它是数组中最新的方法调用。最后一个元素代表堆栈底,是该数组中最旧的方法调用,此方法是1.5过后的。

image.png

Map<Thread,StackTraceElement[]> getAllStackTraces:返回所有活动线程的堆栈跟踪的一个映射,用map来存储,键是线程,值是一个StackTraceElement数组

image.png

getId():获取线程的唯一标识,标识为long类型的。

总结:今天的讲解还是很简单的,我们说到了线程的常用API以及其作用,也就是JAVA中Thread类中的方法。