• 多线程(线程的状态、终止、休眠、礼让、合并)


    1、线程状态

    2、线程的终止

    不推荐使用JDK提供的stop方法、destory方法,他们已经被废弃,这里使用标志位来终止线程

    public class TestStop implements Runnable {
        private boolean flag=true;
        @Override
        public void run() {
            int i=0;
            while(flag){
                System.out.println("Thread"+i++);
            }
        }
    
        public void stop(){
            this.flag=false;
            System.out.println("线程停止了!!");
        }
    
        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);//主线程循环到800的时候,让创建的线程停止
                if(i==900){
                    testStop.stop();
                }
            }
        }
    }

     线程被终止之后,只有主线程在运行

    3、线程的休眠

    需要指定当前线程阻塞的毫秒数,时间到达之后就进入就绪状态,可以模拟网络延时、倒计时等。每一个对象都有一把锁,sleep不会释放锁

    (1)模拟网络延时:

    public class TestSleep implements Runnable{
        private int ticketsNums=10;
        @Override
        public void run() {
            while(true){
                if(ticketsNums<=0){
                    break;
                }
                try {
                    Thread.sleep(200);//延时200ms
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread()+"拿到了"+ticketsNums--+"张票");
            }
        }
    
        public static void main(String[] args) {
            TestSleep testThread=new TestSleep();
            new Thread(testThread,"zhai").start();
            new Thread(testThread,"zhang").start();
            new Thread(testThread,"liu").start();
        }
    }

    如果不添加延时的代码,就会被第1个线程全部取走,当然,这个程序也体现了,在多个线程操作同一个数据的时候,存在线程安全的问题。

    (2)模拟倒计时

    public class TestSleep implements Runnable{
        @Override
        public void run() {
            int num=10;
            while(true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(num--);
                if(num<=0){
                    break;
                }
            }
        }
    
        public static void main(String[] args) {
            TestSleep testSleep=new TestSleep();
            testSleep.run();
        }
    }

    主线程每隔一秒钟调用一次run方法,参数为一千毫秒,也就是一秒钟

     (3)读取系统时间

    public class TestSleep implements Runnable{
        @Override
        public void run() {
            Date startTime=null;
            while (true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                startTime=new Date(System.currentTimeMillis());
                System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
    
            }
        }
    
        public static void main(String[] args) {
            TestSleep testSleep=new TestSleep();
            testSleep.run();
        }
    }

    主线程每隔一秒钟读取一次系统时间,是通过调用run方法实现的

     4、线程礼让

    让当前正在执行的线程暂停,但不阻塞,将线程从运行状态,变为就绪状态,让CPU重新调度,礼让不一定成功

    public class TestYield implements Runnable{
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+"线程开始执行");
            Thread.yield();
            System.out.println(Thread.currentThread().getName()+"线程停止执行");
        }
    
        public static void main(String[] args) {
            TestYield testYield=new TestYield();
            new Thread(testYield,"a").start();
            new Thread(testYield,"b").start();
        }
    }
    a线程开始执行
    b线程开始执行
    a线程停止执行
    b线程停止执行

     5、合并线程

    待其它线程执行完成后,再执行调用JOIN方法的线程,此线程阻塞

    public class JoinTest implements Runnable {
        @Override
        public void run() {
            for(int i=0;i<100;i++){
                System.out.println("线程VIP来了");
            }
        }
    
        public static void main(String[] args) {
            JoinTest joinTest=new JoinTest();
            Thread thread=new Thread(joinTest);
            thread.start();
    
            for(int i=0;i<1000;i++){
                if(i==200){
                    try {
                        thread.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("main-----"+i);
            }
        }
    }

    测试:

    main-----194
    main-----195
    main-----196
    main-----197
    main-----198
    main-----199
    线程VIP来了
    线程VIP来了
    线程VIP来了
    线程VIP来了
    线程VIP来了
    线程VIP来了

    当组线程执行到200的时候,主线程被阻塞,开始执行定义的VIP线程,直到VIP线程执行完毕,再开始执行主线程

    6、线程的状态

    public class StateTest implements Runnable {
        @Override
        public void run() {
    
        }
    
        public static void main(String[] args) {
            Thread thread = new Thread(() -> {
                for (int i = 1; i < 5; i++) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("---------------");
            });
    
            Thread.State state = thread.getState();
            System.out.println(state);
    
            thread.start();
            state = thread.getState();
            System.out.println(state);
    
            while (state!=Thread.State.TERMINATED){//只要线程不终止,就一直输出线程的状态
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                state=thread.getState();
                System.out.println(state);
            }
        }
    }

    测试:

    NEW
    RUNNABLE
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    TIMED_WAITING
    ---------------
    TERMINATED
  • 相关阅读:
    浅谈桶排思想及[USACO08DEC]Patting Heads 题解
    【知识总结】CSS中样式覆盖优先顺序
    【知识总结】Activiti工作流学习入门
    mac下安装nginx问题解决
    spring项目中dubbo相关的配置文件出现红叉的问题
    mybatis对java自定义注解的使用——入门篇
    自学spring过程中碰到的问题list,一个一个解决
    mac下常用软件整理
    小米面试题目(测试开发岗位——不是测试,是测试工具和平台的开发岗位)
    Knockoutjs:Component and Custom Elements(翻译文章)
  • 原文地址:https://www.cnblogs.com/zhai1997/p/12971575.html
Copyright © 2020-2023  润新知