多线程-线程停止、休眠、礼让、观测、优先级、守护(四)

多线程-线程停止、休眠、礼让、观测、优先级、守护(四)

  1. 线程的五大状态

在这里插入图片描述

  1. 线程停止

    • 建议使用线程正常停止
    • 建议使用标志位–>设置一个标志位
    • 不要使用stop或者destory等过时或者JDK不建议使用的方法
    //测试stop
    public class TestStop implements Runnable {
          
          
    
        //1.设置一个标识位
        private boolean flag=true;
    
    
        @Override
        public void run() {
          
          
            int i=0;
            while (flag){
          
          
                System.out.println("run.....Thread"+i++);
            }
        }
        //2.设置一个公开的方法停止线程,转换标志位
        public void stop(){
          
          
            this.flag=false;
        }
    
        public static void main(String[] args) {
          
          
            TestStop testStop=new TestStop();
            new Thread(testStop).start();
    
            for (int i = 0; i < 1000; i++) {
          
          
                System.out.println("main"+i);
                if (i==900){
          
          
                    //调用stop方法切换标志位,让线程停止
                    testStop.stop();
                    System.out.println("线程该停止了");
                }
            }
        }
    }
    
    
  2. 线程休眠

    • sleep(时间)指定当前线程阻塞的毫秒数
    • sleep存在异常InterruptedException
    • sleep时间达到后线程进入就绪状态
    • sleep可以模拟网络延时、倒计时等
    • 每个对象都有一个锁,sleep不会释放锁(后面会学到,不急)
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    //模拟倒计时
    public class TestSleep2 {
          
          
        public static void main(String[] args) {
          
          
           /* //打印倒计时
            try {
                tenDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }*/
           //打印当前系统时间
            Date startTime=new Date(System.currentTimeMillis());//获取系统当前时间
            while (true){
          
          
                try {
          
          
                    Thread.sleep(1000);
                    System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
                    startTime=new Date(System.currentTimeMillis());//更新当前时间
                } catch (InterruptedException e) {
          
          
                    e.printStackTrace();
                }
            }
        }
    
        //模拟倒计时
        public static void tenDown() throws InterruptedException {
          
          
            int num=10;
            while (true){
          
          
                Thread.sleep(1000);//倒计时10秒,每一次打印停一秒
                System.out.println(num--);
                if (num<0){
          
          
                    break;
                }
            }
        }
    }
    
    
  3. 线程礼让

    • 礼让线程,让当前正在执行的线程暂停,但不阻塞
    • 将线程从运行状态转为就绪状态
    • 让cpu重新调度,礼让不一定成功,看cpu心情。
    //测试礼让线程
    //礼让不一定成功,看cpu心情
    public class TestYield {
          
          
        public static void main(String[] args) {
          
          
            MyYield myYield=new MyYield();
    
            new Thread(myYield,"a").start();
            new Thread(myYield,"b").start();
    
        }
    
    }
    
    class MyYield implements Runnable{
          
          
    
        @Override
        public void run() {
          
          
            System.out.println(Thread.currentThread().getName()+"线程开始执行");
            Thread.yield();//礼让
            System.out.println(Thread.currentThread().getName()+"线程停止执行");
        }
    
    
  4. 线程Join

    • Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞
    • 可以想象成插队
    //测试join方法//想象为插队
    public class TestJoin implements Runnable {
          
          
    
        @Override
        public void run() {
          
          
            for (int i = 0; i < 1000; i++) {
          
          
                System.out.println("线程vip来了"+i);
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
          
          
    
            //启动我们的线程
            TestJoin testJoin=new TestJoin();
            Thread thread=new Thread(testJoin);
            thread.start();
    
            //主线程
            for (int i = 0; i < 500; i++) {
          
          
                if (i==200){
          
          
                    thread.join();//插队
                }
                System.out.println("main"+i);
            }
        }
    }
    
    
  5. 观测线程状态

在这里插入图片描述

//观察测试线程的状态
public class TestState {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    
        Thread thread=new Thread(()->{
    
    
            for (int i = 0; i < 5; i++) {
    
    
                try {
    
    
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
    
    
                    e.printStackTrace();
                }
            }
            System.out.println("///");
        });

        //观察状态
        Thread.State state= thread.getState();
        System.out.println(state);//NEW

        //观察启动后
        thread.start();//启动线程
        state=thread.getState();
        System.out.println(state);//Run

        while (state!=Thread.State.TERMINATED){
    
    //只要线程不终止,就一直输出状态
            Thread.sleep(100);
            state=thread.getState();//更新线程状态
            System.out.println(state);//输出状态
        }

       // thread.start();//死亡之后的线程就不能再次启动了

    }
}

  1. 线程的优先级

    • Java提供一个线程调度器里监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级应该调度哪个线程来执行。
    • 线程的优先级用数字表示,范围从1-10
      • Thread.MIN_PRIORITY =1;
      • Thread.MAX_PRIORITY=10;
      • Thread.NORM_PRIORITY=5;(默认)
    • 使用以下方式改变或获取优先级
      • getPriority.setPriority(int xxx)
    • 优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用了,这都是看CPU的调度.
    //测试线程的优先级
    public class TestPriority extends Thread {
          
          
        public static void main(String[] args) {
          
          
            //主线程默认优先级 默认的优先级是5
            System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());
    
            MyPriority myPriority=new MyPriority();
    
            Thread t1=new Thread(myPriority);
            Thread t2=new Thread(myPriority);
            Thread t3=new Thread(myPriority);
            Thread t4=new Thread(myPriority);
            Thread t5=new Thread(myPriority);
            Thread t6=new Thread(myPriority);
    
            //先设置优先级,再启动
            t1.start();
    
            t2.setPriority(1);
            t2.start();
    
            t3.setPriority(4);
            t3.start();
    
            t4.setPriority(Thread.MAX_PRIORITY);//MAX_PRIORITY=10
            t4.start();
    
            t5.setPriority(8); //优先级是1-10之间。超过或小于都是错的
           t5.start();
    
            t6.setPriority(7);
            t6.start();
    
           /* t5.setPriority(-1); //优先级是1-10之间。超过或小于都是错的
           t5.start();
    
            t6.setPriority(11);
            t6.start();*/
        }
    
    }
    
    class MyPriority implements Runnable{
          
          
    
        @Override
        public void run() {
          
          
            System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());
        }
    }
    
  2. 守护(daemon)线程

    • 线程分为用户线程和守护线程
    • 虚拟机必须确保用户线程执行完毕
    • 虚拟机不用等待守护线程执行完毕
    • 如,后台记录操作日志,监控内存,垃圾回收等待。
    //测试守护线程
    //上帝守护你
    public class TestDaemon {
          
          
        public static void main(String[] args) {
          
          
            God god=new God();
            You you=new You();
    
            Thread thread=new Thread(god);
            thread.setDaemon(true);//没写true之前,默认是false表示是用户线程,正常的线程都是用户线程..
    
            thread.start();//上帝守护线程启动
            new Thread(you).start();//你 用户线程启动....
        }
    }
    
    
    //上帝
    class God implements Runnable{
          
          
    
        @Override
        public void run() {
          
          
            while (true){
          
          
                System.out.println("上帝保佑着你!");
            }
        }
    }
    
    
    //你
    class You implements Runnable{
          
          
    
        @Override
        public void run() {
          
          
            for (int i = 0; i < 36500; i++) {
          
          
                System.out.println("你一生都开心的活着");
            }
            System.out.println("==========goodbye! world==========");//Hello,World!
        }
    }
    

猜你喜欢

转载自blog.csdn.net/Xun_independent/article/details/114989733