Java多线程编程复习总结(一)

Java中多线程概述

一、基本概念

进程和线程

  1. 进程是程序运行的实例,比如Java程序就是一个Java虚拟机进程
  2. 每个进程中可以包含多个线程,每个线程完成各自不同的任务,在Java平台中一个线程对应一个对象

    但是这个对象和普通类中声明的对象不一样,不是分配在对空间中的;而是,JVM会给每个线程分配一个栈空间,这个和普通对象还是有区别的

Java中线程的使用

  1. 继承Thread类,重写run()方法(线程实现人任务的入口);主方法中实例化子类后使用start()启用
  2. 实现Runnable接口,主方法中实例化实现类,该实例 作为Thread类构造参数实例化,调用start()方法启用

    可以使用同一个Runnable实例作为参数构造多个线程,实现数据共享

Java中线程具体体现

  1. Java进程运行,Java虚拟机启动的时候会创建一个main线程,执行Java程序入口方法,即main方法

    并不是main方法是线程,它只是主函数线程栈中的一个栈帧,也就是说Java程序运行中有一个线程是负责执行主方法的。

  2. start()方法启动线程,调度是由Java虚拟机调度的,线程的run()方法执行结束时,这个线程也就结束了;start()方法只能调用一次,不能重复调用,会报错
  3. Java中任何一段代码都是被某一个线程所执行(所有线程都是执行main函数的主线程创建的,可以嵌套),通过static Thread currentThread()静态方法查看当前代码段被哪个线程所执行

    同时,一段代码可以被多个线程执行,比如实现Runnable方法创建线程时,使用同一个Runnable实例就是这种效果

Java中Thread类

  1. 常用属性:tid,name,daemon,priority
  2. 常用方法:
    public static native Thread currentThread();
    public void run()
    void start()
    void join()//A调用B.join(),即当B执行完,才会执行A线程任务
    static void yield()
    static void sleep(long millis)
    

线程的状态和调度

  1. 6种状态
    在这里插入图片描述
  2. Java种多个线程抢占式调度,就会造成竞态(结果的正确与否和时间有关)和上下文切换。

二、多线程使用中的安全性

  1. 因为共享变量的存在导致运行结果可能出现不同的情况
  2. 产生竞争状态的几种情况:
    • 多个线程对临界区进行读+改+写,会导致脏读或者丢失修改(一个线程读了另一个线程写之前的,或者两者同时写一个变量等)

    • 多个线程判断+执行,其中判断条件的更改无法同步导致的错误执行

      public class RaceState {
          public static void main(String[] args) throws InterruptedException {
              ThreadTask threadTask = new ThreadTask();
              Thread thread1 = new Thread(threadTask);
              Thread thread2 = new Thread(threadTask);
              Thread thread3 = new Thread(threadTask);
              Thread thread4 = new Thread(threadTask);
      
              thread1.start();
              //Thread.currentThread().sleep(1000);
              thread2.start();
              thread3.start();
              thread4.start();
      
          }
          static class ThreadTask implements Runnable{
              private int count = 0;
      
              @Override
              public void run() {
                  do{
                      count++;
                      showCount();
                  }while (count < 100);
      
              }
              private void showCount(){
                  System.out.println(Thread.currentThread().getName() + ":" + count);
              }
          }
      }
      

      在这里插入图片描述

      可以看出 两个线程出现了冲突

热门文章

暂无图片
编程学习 ·

【Android 内存优化】Bitmap 图像尺寸缩小 ( 考虑像素密度、针对从不同像素密度资源中解码对应的 Bitmap 对象 | inDensity | inTargetDensity )

文章目录一、像素密度对解码图片的影响二、不考虑像素密度会导致图片缩小尺寸不准确三、DisplayMetrics 源码阅读、研究手机资源获取规则四、像素密度参数设置取值 ( inDensity | inTargetDensity | setDensity )五、inDensity 与 inTargetDensity 设置六、新的图片缩小工具类代…
暂无图片
编程学习 ·

[UML] 类图之间的关系 | 4.接口与实现关系

[UML] 类图之间的关系 | 4.接口与实现关系 4.接口与实现关系接口之间也可以有与类之间关系类似的继承关系和依赖关系接口和类之间存在一种实现(Realization)关系,在这种关系中,类实现了接口,类中的操作实现了接口中声明的操作在UML中,类与接口之间的实现关系用带空心三角形…
暂无图片
编程学习 ·

[云盘](二)我的文件和共享列表后台实现

后台代码实现我的文件列表Mian读取配置信息解析json登录token(cmd为count)解析jason(cmd不为count)获取用户文件个数获取用户文件列表源码共享文件列表main获取共享文件个数前端分页请求包获得普通共享文件列表共享文件排行榜源码 我的文件列表业务逻辑是,点击我的文件,会…
暂无图片
编程学习 ·

Python——走马灯

走马灯 def f():import times=人生苦短,我学Pythonc=0while True:print(s)time.sleep(0.3)#休眠0.3秒。每隔0.3秒,即300毫秒显示一行代码s=s[1:]+s[0]c+= 1if c==2*len(s):break f()输出结果 人生苦短,我学Python 生苦短,我学Python人 苦短,我学Python人生 短,我学Python…
暂无图片
编程学习 ·

[46]api接口文档的生成和与项目文档进行集成

导出api文档 登录Eolinker 平台,生成api文档因为我们不是付费用户,所以无法导出markdown文档,所以导出了html文档 集成到docsify 因为docsify默认时处理markdown的,所以如果我们放上一个html文件就会出现解析错误,所以我们需要对该路径启用不处理window.$docsify = {name:…
暂无图片
编程学习 ·

JDK的安装与配置

搭建java开发环境 java语言执行需要经过编译原代码,之后才可以在JVM上解释字节码车光绪,这些需要JDK的支持才能完成 开发者可以直接通过Oracle官方网站获取JDK工具。选择与自己操作系统对应版本,初学者版本不必过新。 下载完之后获得一个程序安装包,双击运行即可。 例如将J…
暂无图片
编程学习 ·

三通道低功耗AS3933/PAN3501低频唤醒芯片125K

三通道低功耗 ASK 接收机 1 、概 述 PAN3501 是一款支持最多三个通道接收的低功耗 ASK 接收机,可用于检测 15kHz-150kHz之间的 LF 载波频率的数据信号并触发唤醒信号。支持检测可编程的 16 位或 32 位曼彻斯特唤醒模式。 …
暂无图片
编程学习 ·

CQF笔记M1L3泰勒级数和转移概率密度函数

CQF笔记M1L3泰勒级数和转移密度函数Module 1 Building Blocks of Quant FinanceLecture 2 Taylor Series and Transition Density Functions泰勒级数期权价格的泰勒级数trinomial random walk和转移密度函数Similarity solutions 求解过程 Module 1 Building Blocks of Quant F…
暂无图片
编程学习 ·

HashMap的高效遍历方式

HashMap<Integer,Integer> map = new HashMap<>(); 第一种(直接keySet()或者values()遍历): for(Integer key:map.keySet()){System.out.println("key:"+key+",value:"+map.get(key)); }第二种(使用entrySet,底层也使用的迭代器,高效):…
暂无图片
编程学习 ·

想进大厂?字节跳动等独角兽公司都在重金招聘Python工程师!(Python就是第一语言!)

在本文章中,作者通过自身经历,力求客观的谈谈个人选择学习Python的动机,以及独角兽公司对Python工程师的要求及薪资。 从目前各种迹象(企业招聘,语言排名等)看来Python相对Java应该是暂时领先,这得力于Python的厚积薄发。 01选择Python不只是选择一门语言 你能收获并不仅…
暂无图片
编程学习 ·

基于小程序请求接口 wx.request 封装的类 axios 请求

基于小程序请求接口 wx.request 封装的类 axios 请求Introductionwx.request 的配置、axios 的调用方式源码戳我 feature支持 wx.request 所有配置项支持 axios 调用方式支持 自定义 baseUrl支持 自定义响应状态码对应 resolve 或 reject 状态支持 对响应(resolve/reject)分别…
暂无图片
编程学习 ·

金秋十月,再聚蓉城!一展一会,涌动环保新商机!

如果不是……今天会是“第二届中国环博会成都展”与“2020中国环境产业高峰论坛”开幕的日子。现在,两大盛会确定改到10月13-15日,地点仍为中国成都西部国际博览城。在等待的日子里,我们一起来回顾一下去年展会的盛况,再跟朋友们说说今年的最新动态。 品牌环保展落户蓉城 强…
暂无图片
编程学习 ·

04-javaWeb-jQuery

目录jQueryjquery中效果案例1-弹出广告选择器总结案例2-隔行换色属性和css操作总结对属性的操作对css操作案例3-全选或者全不选jQuery数据遍历、val设置、标签设置、元素创建案例4-省市联动选择器——表单对象属性过滤选择器案例5-左右移动总结jQuery技术:定时器jQueryjquery和…
暂无图片
编程学习 ·

SOLR_8.2_学习、使用、计划、思想、项目实践

文章目录一、项目安装部署:1.1、下载地址:1.2、解压1.3、启动1.4、浏览器访问二、项目部分配置2.1、创建核心文件夹(可以理解为数据库)2.2、将配置文件copy到meta_db中2.3、创建核心三、创建document(表)添加Field(字段)四、导入数据 documents五、查询数据5.1、查询全…
暂无图片
编程学习 ·

JavaScript按位运算符

按位运算符将其操作数当做32位的比特序列(由0和1组成),而不是十进制、十六进制或八进制数值。 我们主要了解的有七种,分别是:&、|、^、~、<<、>>、>>>。 按位与运算符 按位与 & 运算符,对两个 32 位表达式的每一位执行按位与运算。如果a 和…
暂无图片
编程学习 ·

django-基础二(url与视图)

一、视图 1、视图作用:完成相关逻辑 2、视图写在app的views.py文件夹中,且视图函数的第一个参数一定是request,且必须renturn返回httpresponsebase对象或者是子类对象 二、url 1、URL映射 url作用:视图与浏览器界面沟通桥梁。在用户输入了某个url,请求到我们的网站的时候,…