线程的生命周期的方法

线程的生命周期:

指线程从创建到启动,直至运行结束,可以通过调用Thread的相关方法影响线程的运行状态

线程的运行状态::

新建、可执行、运行、阻塞、死亡

yield():若当前线程调用该方法,则由执行状态变成可运行状态

package org.jsoft.Thread;

public class YieldThreadTest extends Thread{
    
    public static void main(String[] args) {
        Thread t1 = new YieldThreadTest("线程-1");
        Thread t2 = new YieldThreadTest("线程-2");
        t1.start();
        t2.start();
    }
    
    public YieldThreadTest(String name){
        super(name);//这的name第什么,threadName就是什么
    }
    
    @Override
    public void run() {
        super.run();
        for(int i = 0; i < 100; i++){
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + ":" + i);
            if(i%10 == 0){
                yield();//让当前进程重新进入到可执行状态,也就是让出了CPU的控制权,谁抢到谁就执行
            }
        }
    }
}

进入阻塞状态下的三种情况:

1.调用sleep方法(使当前线程休眠一段时间,以毫秒为单位)

2.调用join方法(处在执行状态的线程如果调用了其他线程的join方法,将被挂起进入阻塞状态,目标线程执行完毕后才会接触阻塞,回到可执行状态)

3.执行I/0操作-

join()例子:

package org.jsoft.Thread;

public class JoinThreadTest extends Thread{
    
    public static void main(String[] args) {
        
        Thread t1 = new JoinThreadTest();
        t1.start();
        for(int i = 0; i < 100; i++){
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + ":" + i);
            if(i == 10){
                try {
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    @Override
    public void run() {
        super.run();
        for(int i = 0; i < 100; i++){
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + ":" + i);
        }
    }
}
interrupt():可以解除线程的阻塞状态

package org.jsoft.Thread;

public class InterruptThreadTest extends Thread{
    
    public static void main(String[] args) {
        InterruptThreadTest t1 = new InterruptThreadTest();
        t1.start();
        //调用阻塞线程的interrupt方法(线程睡眠时,调用该线程的interrupt方法会抛出interrruptedException)
        t1.interrupt();
    }
    
    @Override
    public void run() {
        for(int i = 0; i < 100; i++){
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + ":" + i);
            if(i == 10){
                try {
                    Thread.sleep(1000000);//子类不能抛出比父类更大的异常,所以只能try catch
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
}
isAlive()判断线程是否活着(即非死亡状态):

package org.jsoft.Thread;

public class IsAliveThreadTest extends Thread{
    
    public static void main(String[] args) {
        
        IsAliveThreadTest thread = new IsAliveThreadTest();
        System.out.println(thread.isAlive());//false,因为线程还没有执行
        thread.start();//进行可执行状态,抢占CPU的资源
        System.out.println(thread.isAlive());//true,因为线程执行了
        //在当前的main线程中调用thread线程的join()来让thread这个线程运行完毕,挂起当前的main线程
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread.isAlive());//false,因为线程执行完毕
        thread.start();//线程执行完毕后在开启则会报错:java.lang.IllegalThreadStateException
    }
    
    @Override
    public void run() {
        for(int i = 0; i < 100; i++){
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + ":" + i);
        }
    }
}
 

猜你喜欢

转载自my.oschina.net/u/3686592/blog/2252467