多线程part4-常见的成员方法
getName()和setName()
String getName() //返回线程的名称
void setName(String name) 设置线程的名字(构造方法亦可设置)
细节:
如果我们没有给线程设置名字,默认名字格式为:Thread-x(x序号,从0开始)
如果给线程设置名字,可以用set方法,也能用构造方法进行设置,但要记得子类也要有
1 2 | Thread t3 = new Thread(); t3.setName( "飞机" ); |
相当于
Thread t3 = new Thread(”飞机“);
currentThread()
static Thread currentThread() 获取当前线程的对象
细节:
我们在main方法下,如果运行如下代码,那么会发现,输出main
Thread t= Thread.currentThread(); String name = t.getName(); System.out.println(name);
原因:
当JVM虚拟机启动之后,会自动启动多条线程
其中有一条就是main线程
他的作用就是去调用main方法并执行
sleep()
static void sleep(long time) 让线程休眠指定的时间,单位为毫秒
细节:
哪条线程执行到这个方法,那么哪个就会停留
单位为毫秒 时间倒了之后,线程会自动醒来,继续执行下面的代码
调用sleep会让当前线程从Running进入Time Waiting状态(阻塞)
其他线程可以使用interrupt方法打断正在睡眠的线程,此时sleep方法会抛出InterruptedException
睡眠结束后的线程未必会立刻得到执行
建议使用TimeUnit的sleep来代替Thread的sleep,以得到更好可读性
TimeUnit把时间单位划分为很多不同的单位,秒、毫秒、微秒、天、小时、分钟、纳秒
interrupt()
打断后进行标记,可以通过boolean isInterrupted()进行查看
打断阻塞状态的线程————sleep,wait,join的线程
当它们被打断时,会以异常的方式表达已被打断,将打断标记清空,所以打断标记会为false
打断正常运行的线程
不会清空打断标记,打断标记为true
setPriority()和getPriority()
setPriority(int newPriority) 设置线程优先级
getPriority() 获取优先级
线程的调度有两种:抢占式:多个线程抢夺cpu执行权,执行哪条线程是不确定的,执行时间也是不确定的(体现随机性);非抢占式:线程轮流执行
Java中,采取的是抢占式调度
优先级越大,抢到的概率最大,默认设置为5
查看源码可以看到,Thread设置了最小为1,最大为10,默认为5
优先级不是绝对的,优先级高也有可能抢占不到
setDaemon()
setDaemon(boolean on) 设置为守护线程
细节:
当其他的非守护线程执行完毕之后,守护线程会陆续结束
当非守护线程结束之后,那么守护线程没有存在的必要
不是立马结束
应用场景:
QQ聊天,发送文件时,可以把聊天框当成一个线程,发送文件框当成一个线程
当聊天框被关闭之后,那么发送文件没有存在的必要,那么就可以设置发送文件线程为守护线程
yield()
static yield()出让线程/礼让线程
尽可能的出让当前cpu的执行权
调用yield会让当前线程从Running 进入 Runnable就绪状态,然后调度执行其他线程
也就是说可能存在你让出去的时候,没有其他线程需要用,所以cpu又把执行权还给你
具体的实现还是依赖于操作系统的任务调度器
注释中写道:这是一种尝试,防止过度使用cpu
join()
join() 插入线程/插队线程
把当前线程插入到当前线程之前
join()方法必须写在start()方法之后
当传入参数long n 时,是设置等n毫秒后开抢,n毫秒是上限,不一定等到n毫秒