线程的初步学习(1)

线程可以通过继承Thread类和实现Runnable接口,重写run()方法,编写线程执行体,创建线程对象,调用start()方法启动线程。线程不一定立即执行,要看cpu调度。

线程五大状态

线程具有新生状态(相当于new的时候),就绪状态(调用start方法的时候),运行状态 ,阻塞状态(sleep,wait,同步锁定),死亡状态

 

线程礼让Yield

让在运行的线程暂停,不是阻塞,线程礼让从运行变成就绪状态,礼让的线程是否执行,依旧需要看cpu的调度

假设有两个线程 A 和 B ,A正在CPU中,让A线程礼让,A线程从CPU中出来,重新变成A和B线程竞争,依旧需要看CPU的调度

线程的强制执行Join

可以理解为插队

先运行插队的线程,其他线程阻塞,强制执行

观测线程状态

public class Thread05 {
    public static void main(String[] args) throws InterruptedException {
        //TIMED_WAITING
        Thread thread = new Thread(() -> {
            try {
                for (int i = 0; i < 5; i++) {
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("++++++++++++");
        });
        //获得线程RUN状态
        Thread.State state = thread.getState();
        System.out.println(state);
        //获得线程RUNNABLE状态
        thread.start();
        state = thread.getState();
        System.out.println(state);
        while (state != Thread.State.TERMINATED){
            Thread.sleep(100);
            state=thread.getState();
            System.out.println(state);
        }
    }
}

线程的优先级

线程的优先级高可能先执行,依旧需要看CPU的调度,线程默认优先级为5

先设置优先级,再启动

线程的优先级范围 1~10

public class Thread06 implements Runnable {
​
    @Override
    public void run() {
        //获得线程的名字和线程的优先级
        System.out.println(Thread.currentThread().getName()+
             "<=====>"+Thread.currentThread().getPriority());
    }
​
    public static void main(String[] args) {
        Thread06 thread06 = new Thread06();
​
        Thread t1 = new Thread(thread06);
        t1.setPriority(Thread.MAX_PRIORITY);
        t1.start();
​
        Thread t2 = new Thread(thread06);
        t2.setPriority(8);
        t2.start();
​
        Thread t3 = new Thread(thread06);
        t3.setPriority(6);
        t3.start();
​
        Thread t4 = new Thread(thread06);
        t4.setPriority(4);
        t4.start();
​
        Thread t5 = new Thread(thread06);
        t5.setPriority(2);
        t5.start();
    }

守护线程

线程分为用户线程和守护线程

虚拟机不用等待守护线程结束,虚拟机必须等待用户线程结束,默认都是用户线程

通过setDaemon()方法设置守护线程

true 为开启守护线程 默认为false 为用户线程

posted @ 2020-07-07 20:37  岁墨  阅读(133)  评论(0)    收藏  举报