一、线程的生命周期
新建、就绪、运行、阻塞、死亡5种状态
使用new创建线程时处于新建状态(JVM为其分配内存,初始化变量),start时线程处于就绪
状态(JVM为其创建方法调用栈和程序计数器)。
启动线程的方法是调用start()方法,而不是run()方法,若调用run()方法,则会把run()方法当其一般方法执行。
并且在调用了run方法后,线程不在处于新建状态,
再去调用start()方法会出现IllegaThreadStateException异常。
二.控制线程
(1)、join线程
作用:让一个线程等待另一个线程。当一个线程调用其他线程的join( )方法时,调用线程阻塞,直
扫描二维码关注公众号,回复:
1610018 查看本文章
到被join方法加入的join线程执行完毕为止。
- package Thread;
- /*
- * 该类具有三个线程,main方法执行启动了子线程,它与main线程并行执行,当
- * mian线程的i=0时就会启动join线程,此时main线程被阻塞,直到join执行
- * 完毕,才会重新启动
- */
- public class ThreadJoin extends Thread{
- //提供一个有参的构造器用于设置线程名
- public ThreadJoin(String name) {
- super(name);
- }
- //重写run()方法
- public void run() {
- for(int i =0;i<100;i++) {
- System.out.println(getName()+i);
- }
- }
- public static void main(String[] args) throws InterruptedException {
- //启动子线程
- new ThreadJoin("子线程:").start();
- for(int i =0;i<100;i++) {
- if(i==20) {
- //执行join的线程
- ThreadJoin tj = new ThreadJoin("被join的线程:");
- tj.start();
- tj.join();
- }
- System.out.println(Thread.currentThread().getName()+i);
- }
- }
- }
说明:join()方法常用的两种类型:
join( );等待被join的线程执行完毕
join(long millis):等待被join的线程最长时间为millis,超过这个时间没执行完不会在等待
(2)、后台线程(守护线程、精灵线程)
运行在后台,是为其他线程服务的线程,JVM的GC线程就是一种典型的后台线程;
特征:所有前台线程都死亡,后台线程自动死亡
使用方法:调用setDaemon(true)方法可以将一个线程设置为后台线程
- package Thread;
- public class DaemonThread extends Thread{
- //重写run()方法
- public void run() {
- for(int i =0;i<100;i++) {
- System.out.println(getName()+" "+i);
- }
- }
- public static void main(String[] args) {
- DaemonThread dt = new DaemonThread();
- //设置为守护线程
- dt.setDaemon(true);
- dt.start();
- for(int i =0;i<10;i++) {
- System.out.println(Thread.currentThread().getName()+" "+i);
- }
- }
- }
(3)、睡眠线程:sleep
让线程暂停并进入阻塞状态,调用sleep()方法实现;
sleep()方法的两种重载形式,
static void sleep(long millis)让线程暂停millis毫秒;
static void sleep(long millis,int nanos)让线程暂停millis毫秒j加毫微秒;
- package Thread;
- import java.util.Date;
- public class SleepThread extends Thread {
- public static void main(String[] args) throws InterruptedException {
- for(int i=0;i<10;i++) {
- System.out.println("当前时间:"+new Date());
- Thread.sleep(2000);
- }
- }
- }
(4)、线程让步:yield