多线程简介

多线程简介

  • 程序本身是指定和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
  • 进程则是执行程序中的一次执行过程,是一个动态的概念。是系统能够资源分配的单位。
  • 通常在一个进程里,可以包含若干个线程,当然一个进程至少有一个线程,不然没有存在的意义。
  • 线程是CPU调度和执行的单位,线程是独立的执行路径

注:很多的多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务器。如果模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为切换的很快,所有就有同时执行的错觉

  • 在程序运行时,及时没有为自己创建线程,后台也会有多个线程,如主线程,gc线程等。
  • main()称为主线程,为系统的入口,用于执行整个程序
  • 在一个线程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为的干预的。
  • 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制。
  • 线程会带来额外的开销,如cpu调度时间,并发控制开销
  • 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致
  • 对现在的程序来说至少需要两个线程,一个是执行main方法的主线程,一个垃圾回收(gc)线程.

​ 我们现在一共有三种方式创建线程,分别是继承Threa类,

//创建方式一:继承Thread类,重写run()方法,调用start开启线程
package com.thread;

public class ThreadTest01 {
    public static void main(String[] args) {
        MyThread01 myThread01 = new MyThread01();
        myThread01.start();
        //start()方法的作用是:启动一个分支线程,在JVM中开辟一个新的栈空间,这段代码在任务完成之后,瞬间就结束了
        //这段代码的任务只是为了开启一个新的栈空间,只要新的栈空间开出来,start ()方法就结束了,线程就启动成功了
        //启动成功的线程会自动调用run方法,并且run方法在分支线的栈底部(压线)
        //run()方法在分支栈的栈底部,man方法在主栈的栈底部,run和main是平级的
        //muThread01.run;不会启动线程,不会分配新的分支线(这就是单线程)
        for (int i = 0; i < 100; i++) {
            System.out.println("主线程"+i);
        }

    }
    static class MyThread01 extends Thread{
        @Override
        public void run() {
            //编写程序,这段程序运行在分支线程中
            for (int i = 0; i < 100; i++) {
                System.out.println("分支线程"+i);

            }
        }
    }

输出:因为输出较多,我们截取一部分,可以看出,是交替执行的。

&#x4E3B;&#x7EBF;&#x7A0B;8
&#x5206;&#x652F;&#x7EBF;&#x7A0B;68
&#x5206;&#x652F;&#x7EBF;&#x7A0B;69
&#x4E3B;&#x7EBF;&#x7A0B;9
&#x5206;&#x652F;&#x7EBF;&#x7A0B;70
&#x5206;&#x652F;&#x7EBF;&#x7A0B;71
&#x5206;&#x652F;&#x7EBF;&#x7A0B;72
&#x5206;&#x652F;&#x7EBF;&#x7A0B;73
&#x5206;&#x652F;&#x7EBF;&#x7A0B;74
&#x5206;&#x652F;&#x7EBF;&#x7A0B;75
&#x5206;&#x652F;&#x7EBF;&#x7A0B;76
&#x4E3B;&#x7EBF;&#x7A0B;10
&#x5206;&#x652F;&#x7EBF;&#x7A0B;77
&#x4E3B;&#x7EBF;&#x7A0B;11
&#x5206;&#x652F;&#x7EBF;&#x7A0B;78
&#x4E3B;&#x7EBF;&#x7A0B;12
&#x5206;&#x652F;&#x7EBF;&#x7A0B;79
&#x4E3B;&#x7EBF;&#x7A0B;13
&#x5206;&#x652F;&#x7EBF;&#x7A0B;80
&#x4E3B;&#x7EBF;&#x7A0B;14
&#x5206;&#x652F;&#x7EBF;&#x7A0B;81
&#x4E3B;&#x7EBF;&#x7A0B;15
&#x4E3B;&#x7EBF;&#x7A0B;16
&#x5206;&#x652F;&#x7EBF;&#x7A0B;82
&#x4E3B;&#x7EBF;&#x7A0B;17

线程开启不一定立即执行,是由cpu安排调度的

代码示例:

public class ThreadTest03 {
    public static void main(String[] args) {
        //创建线程对象
        Thread t = new Thread(new MyRunnable());
        //启动线程
        t.start();
        for (int i = 0; i < 100; i++) {
            System.out.println("主线程"+i);
        }
    }
    //这并不是一个线程类,是一个可运行的类,还不是一个线程
    static class MyRunnable implements Runnable{
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println("分支线程"+i);
            }
        }
    }
}

部分输出结果:

&#x5206;&#x652F;&#x7EBF;&#x7A0B;31
&#x5206;&#x652F;&#x7EBF;&#x7A0B;32
&#x4E3B;&#x7EBF;&#x7A0B;45
&#x4E3B;&#x7EBF;&#x7A0B;46
&#x4E3B;&#x7EBF;&#x7A0B;47
&#x4E3B;&#x7EBF;&#x7A0B;48
&#x4E3B;&#x7EBF;&#x7A0B;49
&#x4E3B;&#x7EBF;&#x7A0B;50
&#x4E3B;&#x7EBF;&#x7A0B;51
&#x4E3B;&#x7EBF;&#x7A0B;52
&#x4E3B;&#x7EBF;&#x7A0B;53
&#x4E3B;&#x7EBF;&#x7A0B;54
&#x4E3B;&#x7EBF;&#x7A0B;55
&#x4E3B;&#x7EBF;&#x7A0B;56
&#x4E3B;&#x7EBF;&#x7A0B;57
&#x4E3B;&#x7EBF;&#x7A0B;58
&#x4E3B;&#x7EBF;&#x7A0B;59
&#x4E3B;&#x7EBF;&#x7A0B;60
&#x4E3B;&#x7EBF;&#x7A0B;61
&#x5206;&#x652F;&#x7EBF;&#x7A0B;33
&#x5206;&#x652F;&#x7EBF;&#x7A0B;34
&#x5206;&#x652F;&#x7EBF;&#x7A0B;35
&#x5206;&#x652F;&#x7EBF;&#x7A0B;36
&#x5206;&#x652F;&#x7EBF;&#x7A0B;37
&#x5206;&#x652F;&#x7EBF;&#x7A0B;38
&#x5206;&#x652F;&#x7EBF;&#x7A0B;39

注:第二种方式实现接口比较常见,因为一个类实现了皆可以,还可以去继承其它的类,更加灵活!

  • 进程与进程之间的内存独立不共享
  • *在一个进程中,线程和线程的堆内存和方法区内存共享。但是栈内存独立,一个线程一个栈

假设启动十个线程,就会有十个栈空间,每个栈与每个栈之间,互不干扰,各自执行,这就是多线程并发

Original: https://www.cnblogs.com/lingstar/p/16529082.html
Author: 星余明
Title: 多线程简介

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/594100/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • c#读取ini文件

    ini 文件(保存为test.ini): [first]one=one’s Value[second]two=two’s Value[third]key1=…

    Java 2023年5月29日
    0115
  • SpringAMQP的使用

    SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便。 SpringAmqp的官方地址:https://sp…

    Java 2023年6月7日
    082
  • SpringBoot项目解决全局响应返回中文乱码问题

    一、问题 新建的基于SpringBoot的MVC项目,在请响应体中,如果有中文,会显示为乱码。 二、解决方案 1、在application.properties中设置: Origi…

    Java 2023年5月30日
    074
  • 抽象工厂模式

    抽象工厂模式,就是用一个超级工厂创建其他的工厂,这个超级工厂也称之为其他工厂的工厂;相较于工厂模式来说,具有更复杂的关系,故用来解决一个家族里面有多个分支的情况。比如一个家族有多个…

    Java 2023年6月9日
    099
  • php 对二维数组按照汉字首字母排序

    1 /** 2 * 取汉字的第一个字的首字母 3 * @param type $str 4 * @return string|null 5 */ 6 function _getFi…

    Java 2023年6月8日
    089
  • 4.Ribbon简介

    Ribbon概述 Ribbon是基于HTTP和TCP的客户端负载均衡器,它基于Netflix Ribbon实现。通过SpringCloud的封装,可以让我们轻松地将面向服务的RES…

    Java 2023年6月8日
    097
  • 【主流技术】ElasticSearch 在 Spring 项目中的实践

    前言 ElasticSearch简称es,是一个开源的高扩展的分布式全文检索引擎。 它可以近乎实时的存储、检索数据,其扩展性很好,ElasticSearch是企业级应用中较为常见的…

    Java 2023年6月6日
    0111
  • synology drive client 连接失败

    添加路由映射,别管你的nas端口是多少,这玩意默认端口就是6690 Original: https://www.cnblogs.com/limumu/p/16385174.html…

    Java 2023年6月6日
    098
  • java 5种IO模型

    人的痛苦会把自己折磨到多深呢? You cannot swim for new horizons until you have courage to lose sight of t…

    Java 2023年6月9日
    078
  • Oracle数据库😊

    sqlplus常用命令 连接数据库:conn 用户名/密码@网络服务标识[as sysdba] 断开数据库连接: 断开和oracle的连接但是不退出sqlplus窗口 区别:sta…

    Java 2023年6月15日
    052
  • Vue3+Vue-cli4项目中使用腾讯滑块验证码

    Vue3+Vue-cli4项目中使用腾讯滑块验证码 简介: 滑块验证码相比于传统的图片验证码具有以下优点: 验证码的具体验证不需要服务端去验证,服务端只需要核验验证结果即可。 验证…

    Java 2023年6月8日
    078
  • 计算机编程领域的三十六种基本思想概览

    运用之妙,存乎一心。 引子 计算机编程领域的基本思想,是大量实践与经验的提炼总结,是近乎于”道”的指南。有了思想的指引,就如同有高人指路,行不迷惑,遇事有法…

    Java 2023年6月9日
    083
  • Android-Java-普通类与抽象类(覆盖)&方法重载

    执行结果: 覆盖,复写,重写的规则: 返回值 方法名 参数类型与数量 必须一致,并且,子类的修饰权限要大于等于父类(父类public 子类public 👌,父类protected …

    Java 2023年5月29日
    0103
  • Spring Cloud 配置application.yml与bootstrap.yml快速入门

    一、概述 _Spring Cloud Config_是 Spring 的客户端/服务器方法,用于跨多个应用程序和环境存储和提供分布式配置。 此配置存储理想地在 Git_版本控制下进…

    Java 2023年5月30日
    092
  • 多表头定位

    (function (cols) {//1.横向处理 设置每一行Xfor (var row = 0; row < cols.length; row++) {var curro…

    Java 2023年6月13日
    065
  • java selenium (十一) 操作弹出对话框

    Web 开发人员通常需要利用JavaScript弹出对话框来给用户一些信息提示, 包括以下几种类型 对话框类型 警告框: 用于提示用户相关信息的验证结果, 错误或警告等 提示框: …

    Java 2023年5月29日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球