• Java多线程基础


    Java多线程基础总结线程的创建、线程状态、如何中断线程与守护线程的概念。

    1、线程创建

    参考Java中创建线程的方式;

    2、线程暂停执行

    强迫当前线程暂停一段时间, 调用Thread.sleep(time)。注意:sleep函数传入的参数是毫秒单位,并且暂停的是当前执行Thread.sleep()的线程。例如间隔1秒控制台输出:

    Thread one = new Thread() {
        @Override
        public void run() {
            for (int i = 0; i <= 10; i++) {
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    
    one.start();

    3、线程优先级

    可以对线程设定优先级,设定优先级的方法是:

    Thread.setPriority(int n) // 1~10, 默认值5

    注意:不可依赖线程优先级保证优先线程一定先执行。

    4、线程状态

    线程的状态有:

    • New:新创建的线程,尚未执行;
    • Runnable:正在执行的线程;
    • Blocked:被阻塞的线程;
    • Wating:等待中的线程;
    • Timed Waiting:执行sleep方法等待中的线程;
    • Terminated:线程已终止。

    5、线程终止

    线程终止的原因有:线程正常终止:run方法执行到return 语句返回;线程异常终止:run方法遇到未捕获的异常意外终止。

    6、线程等待

    线程等待指的是,当前线程等待另一个线程执行结束后,再继续运行。通常在当前线程对目标线程调用join方法,表示待目标线程运行结束后,当前线程再继续执行。join重载方法可以设置超时时间,表示过时不候。

    Thread StudentThread = new Thread() {
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Student");
        }
    };
    
    Thread KongRongThread = new Thread() {
        @Override
        public void run() {
            StudentThread.start();
            try {
                StudentThread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Kong Rong");
        }
    };
    KongRongThread.start();
    //Student
    //Kong Rong

    上述KongRongThread线程需等待StudentThread线程执行结束后,才能继续执行。其中如果 StudentThread.join() 的参数小于1000,表示不再等待 StudentThread线程。

    7、线程中断

    中断线程通常对目标线程调用interrupt方法,目标线程需要反复检测自身状态是否是interrupted状态。注意:使用interrupt方法仅仅是通知目标线程进行中断,是否中断由目标线程实现逻辑。

    另外,若当前线程使用join方法,正在等待目标线程执行;此时若当前线程被调用了interrupt方法,此时join方法会立刻抛出 InterruptedException。为了理解上述,抽象出老板、监工、民工三个线程示例。

    Thread worker = new Thread() {
        @Override
        public void run() {
            for (int i = 0; i <= 10 && !isInterrupted(); i++) {
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
            }
        }
    };
    
    Thread monitor = new Thread() {
        @Override
        public void run() {
            System.out.println("work start!");
            worker.start();
            try {
                worker.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            worker.interrupt();
    
        }
    };
    
    Thread boss = new Thread() {
        @Override
        public void run() {
            monitor.start();
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            monitor.interrupt();
        }
    };
    
    boss.start();

    boss线程,3秒钟后通知 monitor线程中断,monitor负责启动worker线程,并一直等待worker线程执行;worker线程负责间隔一秒钟向控制台输出。其中对monitor调用interrupt后,monitor线程中join方法立即抛出错误。并在结束之前通知worker线程中断,work线程会一直检查 isInterrupted 状态在sleep方法报错后,结束循环。

    另一个常用的中断线程的方法是设置标志位,用法与上述类似。

    public volatile boolean running = true;

    8、守护线程

    守护线程不会影响JVM进程结束,通常为其他线程服务。

    Thread t = new MyThread();
    t.setDaemon(true);
    t.start();
  • 相关阅读:
    etl接口测试总结
    LR controller 参数化
    Mysql导入导出命令
    mysql基本命令
    mysql用户管理(新增用户及权限管理)
    源码编译搭建LAMP
    【OpenGL】Shader实例分析(一)-Wave
    仿真树叶飘落效果的实现(精灵旋转、翻转、钟摆运动等综合运用)
    cocos2d-x游戏开发(十四)用shader使图片背景透明
    泰然发布了一系列 OpenGL3.0 的教程,推荐大家参考学习
  • 原文地址:https://www.cnblogs.com/engeng/p/15540126.html
Copyright © 2020-2023  润新知