目录
目标
- 熟悉线程从创建道销毁的生命周期;
- 理解守护线程和用户线程的差异;
- 区分run()和start()之间的差异。
线程的生命周期
守护线程和用户线程的差异
区别
- 守护线程做后台调度和支持性的工作,因此在框架中很常见,垃圾回收线程是最常见的守护线程;用户线程用来处理业务,所以也有人称之为业务线程;
- 守护线程依赖用户线程存活,用户线程一旦退出,守护线程也会消亡,反之守护线程一直存在;
- finally方法守护线程不一定会执行(取决于cup有没有正好给这个线程分配时间片);
- 用户线程可以通过setDaemon(true)可以设置将自己设置为守护线程,该方法的参数默认为false。
验证
package com.ctx.concurrent.thread;
public class ThreadTest extends Thread {
@Override
public void run() {
try{
while(true){
System.out.println(Thread.currentThread().getName());
}
}finally {
System.out.println("finally");
}
}
public static void main(String[] args) throws InterruptedException {
//验证一:守护线程下finally方法不一定执行;
//验证二:主线程退出后,守护线程也退出(注意此时没有业务线程)。
ThreadTest threadTest = new ThreadTest();
threadTest.setDaemon(true);
threadTest.start();
Thread.sleep(1000);
}
}
package com.ctx.concurrent.thread;
public class ThreadTest extends Thread {
@Override
public void run() {
try{
while(true){
System.out.println(Thread.currentThread().getName());
}
}finally {
System.out.println("finally");
}
}
public static void main(String[] args) throws InterruptedException {
//验证一:业务线程存在,守护线程也存在,即使主线程退出了。
ThreadTest threadTest = new ThreadTest();
threadTest.setDaemon(true);
threadTest.start();
Thread.sleep(1000);
ThreadTest threadTest2 = new ThreadTest();
threadTest2.start();
}
}
run()和start()之间的差异
区别
- run()方法可以被多次调用,且当前线程是主线程;
- start()方法只能被调用一次,且当前线程是线程类的本身。
验证
package com.ctx.concurrent.thread;
public class ThreadTest extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) throws InterruptedException {
ThreadTest threadTest = new ThreadTest();
while(true){
//可以被多次调用,且当前线程是主线程。
//threadTest.run();
//只能被调用一次,且当前线程是ThreadTest本身。
threadTest.start();
}
}
}