线程状态
线程状态描述
1、新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。
2、就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已具有了运行的条件,只是没有分配到CPU资源。
3、运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run()方法定义了线程的操作和功能。
4、阻塞:在某种特殊情况下,被认为挂起或执行输入输出操作时,让出CPU并临时终止自己的执行,进入阻塞状态。
5、死亡:线程完成了它的全部工作或线程被提前强制性的终止或出现异常导致结束。
线程的生命周期
线程在它的生命周期中会处于不同的状态。
控制线程
1、start():启动线程。
2、join():让一个线程等待另一个线程完成。当某个程序执行流中调用了其它线程的join()方法时,调用线程被阻塞,直到join()方法加入的线程执行完毕为止。
join()方法的重载形式:
(1)join():等待被join()的线程执行完成。
(2)join(long millis):等待被join的线程的时间最长为millis毫秒。
3、sleep():线程睡眠,如果需要让当前正在执行的线程暂停一会,并进入阻塞状态,则可以通过调用Thread类的静态sleep()方法来实现。
4、yield():线程让步,让当前正在执行的线程暂停,但不会阻塞该线程,而是直接将该线程转入到就绪状态。yield()只是让当前线程暂停一下,让系统的线程调度器重新调整一次。当某个线程调用yield()方法暂停后,只有优先级与当前线程相同或者优先级比当前线程高的处于就绪态的线程会获得执行的机会。
5、stop():终止当前线程。
6、getState():获取当前线程状态。
代码示例:
public class StateDemo {
/*这是一个程序入口*/
public static void main(String[] args) throws InterruptedException {
ThreadStateDemo state = new ThreadStateDemo();
Thread t1 = new Thread(state, "秒表1");
t1.start();
t1.join(3000);
/*yield()线程让步,让当前正在执行的线程暂停一下,回到就绪状态*/
t1.yield();
Thread t2 = new Thread(state, "秒表2");
t2.start();
/*join()加入线程,让其它线程等待加入的线程执行完毕,也可以写入等待时间*/
// t2.join(3000);
t2.join();
Thread t3 = new Thread(state,"秒表3");
t3.start();
/*终止当前线程*/
t3.stop();
/*获取当前线程状态*/
System.out.println(t3.getState());
Thread t4 = new Thread(state, "秒表4");
t4.start();
}
}
class ThreadStateDemo implements Runnable {
@Override
public void run() {
/*使用Sleep()模拟秒表*/
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + ":第" + i + "秒");
try {
/*sleep()线程睡眠,使当前线程进入阻塞转态,阻塞时间单位为ms*/
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
线程分类
概述
1、Java中的线程分为两类:用户线程和守护线程(也叫“后台线程”或“精灵线程”)。
2、守护线程的作用是为其它线程的运行提供便利服务,守护线程最经典的应用就是GC(垃圾回收器),它就是一个称职的守护者。
3、特征:当所有用户线程都死亡,守护线程会自动死亡。
4、调用Thread对象的setDaemon(true)方法可将指定线程设置成守护线程。isDaemon()方法,判断是否为守护线程。
注意:设置线程为守护线程必须在启动线程之前,否则会出现IllegalThreadStateException异常。
设置守护线程
1、setDaemon(boolean on):将此线程标记为守护线程或用户线程。
2、isDaemon():判断当前线程是否为守护线程。
代码示例
public class DaemonDemo {
/*这是一个程序入口*/
public static void main(String[] args) throws InterruptedException {
DaemonThread daemon = new DaemonThread();
Thread t1 = new Thread(daemon,"线程1");
/*setDaemon(true) 设置此线程为守护线程*/
t1.setDaemon(true);
t1.start();
t1.setPriority(Thread.MIN_PRIORITY);
/*isDaemon() 判断此线程是否为守护线程*/
System.out.println(t1.isDaemon());
Thread t2 = new Thread(daemon,"线程2");
t2.start();
t2.setPriority(Thread.MAX_PRIORITY);
System.out.println(t2.isDaemon());
}
}
class DaemonThread implements Runnable {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}