文章目录
一、Thread常用api
Thread中有静态方法,实例方法
当前线程——某个执行语句(可能是thread的静态方法,实例方法,或其他的System.out.println普通方法)执行的时候所在的线程
线程引用的对象——thread对象.实例方法
1.activeCount()
返回当前线程处于活跃状态的线程数
活跃状态:线程创建以后,销毁之前,都是活跃状态
2.run()
定义线程需要执行的任务代码·
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while(true){
}
}
},"t1线程");
//main线程调用thread对象的run方法(和普通方法调用没有啥区别):
//main线程运行,t1是没有创建的
t1.run();
}
3.start()
创建系统线程,并申请系统调度(转换为就绪态)
如果调度到了,进入运行态,才会执行run方法的任务代码
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while(true){
}
}
},"t1线程");
t1.start();//main线程执行完start就结束了:t1运行,main结束
}
借助jdk的命令可以观察一个Java进程的信息(包括线程的信息):
展示结果:
public static void main(String[] args) {
while(true){
}
}
展示结果:
4.static Thread currentThread()
返回这行代码执行时的当前线程引用对象
5.getName()
返回线程的名称
可以通过new Thread时传入线程名称
6.static void sleep(long millis)
让当前线程休眠 millis(毫秒)
操作系统内部还有一个阻塞队列,线程休眠/阻塞,就是进入这个阻塞队列,等恢复(sleep就是等待一段时间),再拿出来重新执行
7.static void yield()
让当前线程让步(从运行态,转为就绪态)
8.isAlive()
判断线程引用对象是否是活跃状态
9.getPriority()(了解)
setPriority(int newPriority)
返回或设置某个线程的优先级(系统调度时,优先级只是一个指标,所以一般不以这个作为哪个线程先执行)
多个线程,是并发并行执行;如果要让某个线程先执行,一般不使用设置优先级的方式,而使用join、线程通信的方式
10.isDaemon()
setDaemon(boolean on)
设置某个线程为守护线程,true=设置为守护线程,false=设置为非守护线程
不调用=false
那么守护线程是什么呢?
用个比较通俗的比喻:任何一个守护线程都是整个JVM中所有非守护线程的保姆:
只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
Daemon的作用是为其他线程的运行提供便利服务
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while(true){
}
}
});
//t线程作为守护线程,整个Java进程就没有处于活跃状态的非守护线程了
t.setDaemon(true);
t.start();
}
11.中断一个线程
表示中断这个动作
自己实现中断线程的操作:设计一个标志位,表示是否被中断线程每次执行时,循环判断是否被中断了
boolean isTnterrupted():返回线程内置的中断标志位
void interrupt():表示中断这个动作
如果线程处于休眠/等待等状态,让线程中断,是以该线程对象抛异常的方式来中断
(此时会重置中断标志位为初始值false)
至于是否要中断,是线程内任务代码所决定
举例:
我正在玩游戏,我妈叫我去买菜(中断玩游戏过程)
我的反应:
- 好,然后继续玩游戏(中断但程序不管,忽略中断)
- 好,然后去买菜(中断)
中断一个线程,到底要不要中断,是由程序自己的逻辑(判断中断标志位,如果休眠/等待,抛异常进入catch语句,并重置中断标志位)决定
相当于捕获异常后的逻辑,决定是否中断
static boolean interrupted():返回当前线程的中断标志位,调用以后,就会重置标志位(了解)
一般来说,获取中断标志位,无脑的使用isInterrupted就行
12.join()
线程对象t.join(),当前线程加入t线程:当前线程在这行代码等待,等t线程执行完再执行后边的代码
线程之间是并发并行执行,如果想满足线程间的执行顺序,具体是等某个线程执行完,再执行另一个线程,可以使用join
void join(long millis):一般来说,一直等待某个线程执行完,是不太科学的;一般使用超时等待(最多等待xxx毫秒)
要么t线程执行完,要么时间到,当前线程就接着执行
二、线程的状态
- NEW:安排的工作,还未开始行动
- RUNNABLE:可工作的,又可以分为正在工作中和即将开始工作
- BLOCKED:这几个都表示排队等着其他事情
- WAITING:这几个都表示排队等着其他事情
- TIMED_WAITING:这几个都表示排队等着其他事情
- TERMINATED:工作完成了
RUNNABLE:包含就绪态和运行态(程序不知道到底线程是就绪还是运行,由系统决定)
线程状态转换图: