线程常用方法介绍
1、方法概述
方法说明 | static | 功能说明 | 注意 |
---|---|---|---|
start() | 启动一个新线程, 在新的线程运行 run方法中的代码 |
start方法只是让线程进入就绪,里面代码不一定立刻运行 (CPU的时间片还没分给它)。每个线程对象的start方法只 能调用一次,如果调用了多次会出现 IllegalThreadStateException |
|
run() | 新线程启动后会调 用的方法 |
如果在构造Thread对象时传递了Runnable参数,则线程启 动后会调用Runnable中的run方法,否则默认不执行任何操 作。但可以创建Thread的子类对象,来覆盖默认行为 |
|
join() | 等待线程运行结束 | ||
join(long n) | 等待线程运行结束, 最多等待n毫秒 |
||
getId() | 获取线程id | id唯一 | |
getName() | 获取线程名 | ||
setName(String) | 修改线程名 | ||
getPriority() | 获取线程优先级 | ||
setPriority(int) | 修改线程优先 | java中规定线程优先级是1~10的整数,默认是5,较大的优先级 能提高该线程被CPU调度的机率 |
|
getState() | 获取线程状态 | Java中线程状态是用6个enum表示,分别为:NEW RUNNABLE、BLOCKED、WAITING、TIMED_WAITING. TERMINATED |
|
isInterrupted() | 判断是否被打断, | 不会清除打断标记 | |
isAlive() | 线程是否存活 (还 没有运行完毕) |
||
interrupt() | 打断线程 | 如果被打断线程正在sleep,wait,join会导致被打断的线程 抛出InterruptedException,并清除打断标记;如果打断的正 在运行的线程,则会设置打断标记;park的线程被打断,也 会设置打断标记 |
|
interrupted() | static | 判断当前线程是否 被打断 |
会清除打断标记 |
currentThread() | static | 获取当前正在执行 的线程 |
|
sleep(long n) | static | 让当前执行的线程 休眠n毫秒,休眠时 让出cpu的时间片 给其它线程 |
|
yield() | static | 提示线程调度器让 出当前线程对CPU 的使用 |
主要是为了测试调试 |
2、start() vc run()
start方法会启动一个线程,并执行实现的run方法,多次执行会抛异常:IllegalThreadStateException
单独调用run方法,会当作main线程中的一个普通线程
public static void main(String[] args) {
Thread t = new Thread(() -> {
log.debug("hello world");
}, "t");
t.run();
t.start();
t.start();//start()方法多次启动会抛异常IllegalThreadStateException
}
3、sleep vs yield
1、sleep
1.调用sleep会让当前线程从Runnable进入Timed_Waiting状态
2.其它线程可以使用interrupt方法打断正在睡眠的线程,这时sleep方法会抛出InterruptedException
3.睡眠结束后的线程未必会立刻得到快行
4.建议用TimeUnit的sleep代替Thread的sleep来获得更好的可读性
2、yield
1.调用yield会上当前线程从Running进入Runnable状态,然后调度执行其它同优先级的线程。如果这时没
有同优先级的线程,那么不能保证让当前线程暂停的效果
2.具体的实现依赖于操作系统的任务调度器
3、线程优先级
-
线程优先级会提示(hit)调度器优先调度该线程,但它仅仅是一个提示,调度器可以忽略它
-
如果CPU比较忙,那么优先级高的线程会获得更多的时间片,但CPU闲时,优先级几乎没作用
-
优先级1-10,默认为5
4、示例
打断正在sleep、wait、join的线程,清楚打断标记,并抛出异常
public static void main(String[] args) {
Thread t = new Thread(() -> {
try {
log.debug("run...");
TimeUnit.SECONDS.sleep(1);//还是使用了Thread.sleep(),线程执行1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "t");
t.start();
log.debug("state1:{}", t.getState());
try {
Thread.sleep(500);//线程执行0.5秒,不停顿,容易导致t线程还没开始执行执行下面的语句:t.getState()等等,结果会不准确
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("state2:{}", t.getState());
//打断正在sleep、wait、join的线程,清楚打断标记
log.debug("interrupt...");
t.interrupt();
log.debug("打断标记:{}", t.isInterrupted());
}
yield会让出CPU,测试优先级和yield
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
int count = 0;
while (true) {
Thread.yield();
System.out.println("t1 ---->" + count++);
}
});
Thread t2 = new Thread(() -> {
int count = 0;
while (true) {
System.out.println(" t2 ---->" + count++);
}
});
// t1.setPriority(Thread.MIN_PRIORITY);//优先级1
// t2.setPriority(Thread.MAX_PRIORITY);//优先级10
t1.start();
t2.start();
}
使用yield
使用优先级(注释 Thread.yield()
标签:常用,Thread,start,线程,打断,debug,sleep,方法 From: https://www.cnblogs.com/WangJiQing/p/16989271.html