zoukankan      html  css  js  c++  java
  • 多线程相关概念

    相关概念

    • 进程:启动一个应用程序,就会开启一个进程(微信,QQ,浏览器等等)

    • 线程:程序的执行路径

    • 进程和线程的区别:进程是在操作系统下的并发,线程是在应用程序下的并发

    • 多线程:在同一进程中开启了多个不同的执行路径,多个路径同时执行

    • 多线程好处:提高程序整体运行速度,快速响应

    • 多线程的应用场景:

      • 异步发送短信
      • 异步记录日志
      • 对耗时代码采用异步处理
    • CPU切换:

      单核CPU:同一时刻只有一个线程可以工作,线程上下文切换耗费资源

      多核CPU:同一时刻多个线程同时工作,上下文切换较少

    • 多线程越多越好?

      小型项目:使用多线程异步

      大型项目:使用MQ代替多线程

    • 用户线程和守护线程的区别:

      • 用户线程当主线程停止后,用户线程也会一直运行。thread.setDaemon(false);

      • 而守护线程当我们主线程停止后,守护线程也会停止。thread.setDaemon(true);

    停止线程的方式

    建议采用变量的方式停止线程

    public class Thread005 extends Thread {
        private volatile boolean flag = true;
    
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
            while (flag) {
    
            }
        }
    
        public void stopThread() {
            this.flag = false;
        }
    
    
        public static void main(String[] args) {
            Thread005 thread005 = new Thread005();
            thread005.start();
            try {
                Thread.sleep(3000);
                thread005.stopThread();
            } catch (Exception e) {
    
            }
        }
    }
    

    多线程的5种状态

    • 新建一个线程,new Thread的时候为新建的状态
    • 调用到start方法的时候,当前线程状态为就绪状态,需要等待cpu的切换。
    • 当cpu切换能够调用到该线程的时候,当前线程的状态为运行状态。
    • 在线程调用sleep方法的时候,当前线程线程的状态为阻塞状态,当休眠的时候过了的时候有需要从新等待cpu调度,从就绪状态到运行。
    • 当线程调用stop方法或者run方法代码执行结束的时候当前线程的状态为死亡状态。

    image-20200806115931281

    join方法

    当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1

    class  Main
    {
        public static void main(String[] args) {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i <10 ; i++) {
                        System.out.println("子线程...");
                    }
                }
            });
    
            thread.start();
    
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            for (int i = 0; i <10 ; i++) {
                System.out.println("main线程.....");
            }
    
            System.out.println("主线程销毁....");
    
        }
    }
    
  • 相关阅读:
    vue使用百度统计埋点
    修改JAVA字节码
    由前序遍历和中序遍历构建二叉树-Python
    二叉树的最大深度-Python
    二叉树的层序遍历-Python
    判断是否是对称二叉搜索树
    什么是主动学习方法
    验证二叉搜索树-Python
    DevExpress如何汉化XAF
    python install 失败?
  • 原文地址:https://www.cnblogs.com/noneplus/p/13454100.html
Copyright © 2011-2022 走看看