/** * java中所有的代码都是靠线程运行的,main方法也不例外。当JVM启动后就会创建一条线程来执行 * main方法,并且该线程被赋予了一个名字也叫"main",我们一般称呼它为"主线程"。但是它和我们 * 创建的线程本身没有区别。 * * 线程提供了一个静态方法: * static Thread currentThread() * 该方法可以获取运行这个方法的线程 */
/** * 线程的优先级 * 当一个线程调用start方法后就纳入到了线程调度器中被统一管理,此时线程只能被动的被分配时间 * 片并发运行,是不能主动索取时间片的。而线程调度器会尽可能均匀的分配时间片给每个线程。 * 通过调整线程的优先级可以最大程度的改善获取时间片的概率。优先级越高的线程获取时间片的次数 * 越多。 * * 线程的优先级有10个等级,分别中整数1-10表示。其中1最低,5为默认值,10最高 * 也可以使用Thread提供的常量:MIN_PRIORITY,NORM_PRIORITY,MAX_PRIORITY。 * 分别表示:最低优先级, 默认优先级, 最高优先级 */ /** * 守护线程 * 也称为"后台线程"。是通过普通线程(也称为用户线程)调用方法setDaemon(true)设置而转变的 * 守护线程在结束时机上与普通线程有一点不同,那就是进程的结束。 * * 进程结束: * 当java进程中所有的普通线程都结束时,进程就会结束,此时它会杀死所有还在运行的守护线程。 */
/** * sleep阻塞 * * 线程提供了一个静态方法: * static void sleep(long ms) * 当一个线程调用sleep方法后就会进入阻塞状态指定毫秒 */ 下面是利用sleep实现一个倒计时输出功能
public class SleepDemo {
public static void main(String[] args) {
System.out.println("程序开始了");
/*
倒计时程序
程序启动后要求输入一个数字,从该数字开始每秒递减,到0时输出时间到。
*/
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数字:");
for(int i = scanner.nextInt();i>0;i--) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("时间到!");
System.out.println("程序结束了");
}
}
/** * sleep方法要求我们必须处理中断异常:InterruptedException * 当一个线程调用sleep方法处于睡眠阻塞的过程中若该线程的interrupt方法被调用,那么此时会 * 强制中断它的睡眠阻塞并抛出异常InterruptedException * 当两个线程并发执行时,thread1和thread2时,当thread1执行完毕后,但是thread2还在睡眠状态, * 可以利用thread2.interrupt();强制打断thread2的睡眠 */
下面是查看Thread相关信息的一组方法
Thread main = Thread.currentThread();//获取主线程
//获取线程的名字
String name = main.getName();
System.out.println(name);
//获取线程的唯一标识
long id = main.getId();
System.out.println(id);
//获取线程的优先级(是一个数字,范围在1-10之间)
int priority = main.getPriority();
System.out.println("优先级:"+priority);
//查看是否为守护线程
boolean daemon = main.isDaemon();
//查看是否活着
boolean alive = main.isAlive();
//查看是否被中断了
boolean interrupted = main.isInterrupted();