1.多线程的常用属性
属性 获取⽅法
ID getId()
名称 getName()
状态 getState()
优先级 getPriority()
是否守护(后台)线程 isDaemon()
是否存活 isAlive()
是否被中断 isInterrupted()
ID 是线程的唯⼀标识,不同线程不会重复
名称是各种调试⼯具⽤到
状态表示线程当前所处的⼀个情况,下⾯我们会进⼀步说明
优先级⾼的线程理论上来说更容易被调度到
关于守护线程(后台线程),需要记住⼀点:JVM会在⼀个进程的所有⾮后台线程结束后,
才会结束运⾏。
是否存活,即简单的理解,为 run ⽅法是否运⾏结束了
线程的中断问题,下⾯我们进⼀步说明
2.守护线程
线程中的分类:
⽤户线程
守护线程(后台线程)
守护线程是为⽤户线程服务的,⽤户线程全部结束之后,守护线程会跟随结束。
JVM 中的垃圾回收器就是典型的守护线程,程序运⾏的时候它也运⾏,当满⾜条件是进⾏垃圾回收,当所有线程执⾏完任务终⽌时它也会随着退出。
线程中的长用方法
1.线程终⽌
⽬前常⻅的有以下两种⽅式:
- 通过⾃定义标记符来进⾏中断。
- 调⽤ interrupt() ⽅法来中断。
2. 线程等待 join
⽅法 说明
public void join() 等待线程结束
public void join(long millis) 等待线程结束,最多等 millis 毫秒
public void join(long millis, int nanos) 同理,但可以更⾼精度
3. yield 让出执⾏权
Thread.yield();
4. 获取当前线程
public static Thread currentThread();
5. 休眠当前线程
public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
System.out.println(System.currentTimeMillis());
Thread.sleep(3 * 1000);
System.out.println(System.currentTimeMillis());
}
}
使⽤ TimeUnit 休眠
底层还是通过sleep实现的,但是不容易出错
TimeUnit.DAYS.sleep(1);//天
TimeUnit.HOURS.sleep(1);//⼩时
TimeUnit.MINUTES.sleep(1);//分
TimeUnit.SECONDS.sleep(1);//秒
TimeUnit.MILLISECONDS.sleep(1000);//毫秒
TimeUnit.MICROSECONDS.sleep(1000);//微妙
TimeUnit.NANOSECONDS.sleep(1000);//纳秒