Thread类的常用方法
目录
Thread类的常用方法
启动(start)
休眠(sleep)
当前线程(currentThread)
join
设置优先级(setPriority)
让步(yield)
设为后台进程(setDaemon)
中断(interrupt)
已经过时的方法(stop、suspend、destroy)
启动(start)
最基本的操作,调用Runnable中的run方法,无返回值。
new Thread(new Test()).start();
休眠(sleep)
使当前线程休眠一段时间,默认为毫秒级,最高可以精确到纳秒,调用的方法为sleep(long millis, int nanos)。
public void run() {
try {
Thread.sleep(1000); //休眠1000ms=1s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
当前线程(currentThread)
返回当前线程的实例。
Thread thread=Thread.currentThread();
join
等待当前线程终止,可以设置等待时间,当超过等待时间时放弃等待。
public class Main {
public static void main(String[] args){
Thread thread1=new Thread(new Test());
Thread thread2=new Thread(new Test());
thread1.start();
try {
thread1.join(); //此时等待thread1执行
} catch (InterruptedException e) {
e.printStackTrace();
}
thread2.start(); //当thread1执行完毕后执行
}
}
设置优先级(setPriority)
设置当前线程的优先级,优先级分三个等级最低优先级MIN_PRIORITY、默认优先级NORM_PRIORITY、最高优先级MAX_PRIORITY
注意:这仅仅只是给系统一个暗示,并不能确保什么
thread.setPriority(Thread.MIN_PRIORITY);
让步(yield)
暂停当前线程,执行其他线程。
注意:这仅仅只是给系统一个暗示,它告诉系统我已经执行完我最重要部分,系统可以去把主要资源用于其他的线程,但是不能确定系统一定会答应,也不能确定系统什么时候答应,所以我们在处理多线程的复杂操作时不应该依赖于yield。
Thread.yield();
设为后台进程(setDaemon)
后台进程运行在后台,独立于整个系统,当系统进程结束,也就是只剩下后台进程时,后台进程退出。
thread.setDaemon(true);
中断(interrupt)
中断线程。
注意:它经常会因为它的名字被误用,它虽然叫中断,但是并不会中断线程,实际上stop()方法有中断线程的作用,所以现在stop已经嗝屁了,由于具有不安全性而被java废除,当然interrupt不能重蹈stop的覆辙,所以它只是给线程打上一个interrupt标记,通过Thread.interrupted可以获取其中断状态,我们可以通过这个标记对当前线程进行处理。
如果当前线程没有中断它自己,则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException。
如果线程在调用wait() 方法,或者该类的join()、sleep()方法过程中受阻,则抛出 InterruptedException。
如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。
如果该线程在一个 Selector 中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的 wakeup 方法一样。
public class Test implements Runnable{
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("线程中断");
return;
}
}
}
public class Main {
public static void main(String[] args){
Thread thread=new Thread(new RunTest());
thread.start();
thread.interrupt();
}
}
运行结果
java.lang.InterruptedException: sleep interrupted
线程中断
at java.lang.Thread.sleep(Native Method)
at Test.run(Test.java:5)
at java.lang.Thread.run(Thread.java:745)
Process finished with exit code 0
已经过时的方法(stop、suspend、destroy)
他们分别是强行停止线程、强行挂起线程、破坏线程,但是现在他们已经被废除,原因便是它们会导致死锁或其他安全性问题。