• 线程的生命周期


    先来看看线程的几个方法:

    package thread.basics;
    
    public class Test_Sleep_Yield_Join {
        public static void main(String[] args) {
            //sleep意思就是睡眠,当前线程暂停一段时间让其他线程去执行,时间到了自动复活
    //        testSleep();
            //yield的意思是当前线程让出一下cpu,后面你们能不能抢到,我不管,也有可能被当前线程继续抢占(实际运用中基本用不到)
    //        testYield();
            //join的意思就是当前线程调用其他线程的jion,会先执行其他线程,直到其他线程执行完毕,才继续执行当前线程
            testJoin();
        }
    
        /**
         * @Author liuyi
         * @Description sleep意思就是睡眠,当前线程暂停一段时间让其他线程去执行,时间到了自动复活。
         * @Date 22:29 2020/5/23
         * @Param []
         * @return void
         **/
        static void testSleep() {
            new Thread(()->{
                for(int i=0; i<100; i++) {
                    System.out.println("A" + i);
                    try {
                        Thread.sleep(500);
                        //TimeUnit.Milliseconds.sleep(500)
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
        /**
         * @Author liuyi
         * @Description
         * @Date 22:31 2020/5/23
         * @Param []
         * @return void
         **/
        static void testYield() {
            new Thread(()->{
                for(int i=0; i<100; i++) {
                    System.out.println("A" + i);
                    if(i%10 == 0) Thread.yield();
    
    
                }
            }).start();
    
            new Thread(()->{
                for(int i=0; i<100; i++) {
                    System.out.println("------------B" + i);
                    if(i%10 == 0) Thread.yield();
                }
            }).start();
        }
    
        static void testJoin() {
            Thread t1 = new Thread(()->{
                for(int i=0; i<10; i++) {
                    System.out.println("A" + i);
                    try {
                        Thread.sleep(500);
                        //TimeUnit.Milliseconds.sleep(500)
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
    
            Thread t2 = new Thread(()->{
    
                try {
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                for(int i=0; i<10; i++) {
                    System.out.println("B" + i);
                    try {
                        Thread.sleep(500);
                        //TimeUnit.Milliseconds.sleep(500)
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
    
            t1.start();
            t2.start();
        }
    }
    

    线程的生命周期(下图为马士兵老师画的):

      

    常见的线程状态有六种:

    1,新建状态:当我们new一个线程,还没有调用start()方法的时候叫新建状态。

    2,Ready就绪状态:当调用start方法之后,线程会被线程调度器来执行,但是通常线程并不能马上执行,因为系统中还有其他线程共同抢占系统的资源,只有抢到了,才能进入Running运行状态,所以在这期间被称之为就绪状态。

    3,Running运行状态:线程处于就绪状态,此时如果抢到系统资源就会进入Running运行状态,直到线程正常结束或者异常中断。

    4,Teminated结束状态:如果顺利执行玩线程,就会进入Teminated结束状态,此时线程不能回到以前的任意状态。

    5,TimedWaiting等待和Waiting等待:TimedWaiting等待指按照时间等待进入Ready就绪状态,时间到了自动回到Running运行状态。Waiting等待通过比如join方法让线程进入Ready就绪状态,需要手动调用方法比如notify()等方法进行唤醒,回到Running运行状态。

    6,Blocked阻塞:在同步代码块的情况下没得到锁就会处于阻塞状态,获得锁之后就进入Running运行状态。

  • 相关阅读:
    Hadoop及HIVE学习宝典收集
    【iOS知识学习】_int、NSInteger、NSUInteger、NSNumber的差别和联系
    mysql 连接慢的问题
    CF704D Captain America
    常用流
    流的概念及基本分类
    是否可从一个static方法内发出对非static方法的调用?
    hashCode方法的作用?
    ClassLoader如何加载class?
    class.forName的作用?
  • 原文地址:https://www.cnblogs.com/liu-yi/p/12944898.html
Copyright © 2020-2023  润新知