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);
              }
          }
      }
      

      在这里插入图片描述

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

热门文章

暂无图片
编程学习 ·

【数据结构】-排序-快速排序

~快速排序在平均情况下是效果最好的排序算法~每趟子表的排序都是从两头向中间交替逼近,接下来举一个例子类别排序方法最好时间最坏时间平均时间空间复杂度稳定性序列特征适用于插入排序直接插入排序n(顺序)n2(逆序)n21稳定有序序列+待排序元素+无序序列基本有序/n很小折半插…
暂无图片
编程学习 ·

dom基础知识笔记

dom:Document Object Model个人认为dom是一种约定,开发者按这种形式写html,浏览器按这种形式解析html
暂无图片
编程学习 ·

leetcode:208. 实现 Trie (前缀树)

链接:https://leetcode-cn.com/problems/implement-trie-prefix-tree/ 实现一个前缀树(节点),一个前缀树节点需要保存它可能的26个孩子的信息,以及这个节点是不是一个单词的结尾。 C++代码: class Trie {Trie * children[26];bool isWord = false; public:/** Initialize…
暂无图片
编程学习 ·

Spring boot的项目文件

1.src–>main–>java 是用来放Java文件2.resources是用来放配置文件 application.properties用来放配置文件的信息3.test用来放一些测试用例4.新建一个Java类5.解决@RequestMapping报Cannot resolve symbol RestController’错误 解决办法: 在错误处按alt+enter 选择a…
暂无图片
编程学习 ·

NEAR的机会

(采摘橄榄,梵高)如今,加密圈都在为DeFi疯狂,在整体市值不升反降的这些日子里,加密圈的情绪一直高涨。这是因为Compound效应带来的结果。 虽然公链关注度暂时不如之前,但这一赛道依然是加密领域最重要的赛道。在ETH2.0没有充分证明和虹吸一切之前,一切都存在着概率和可能…
暂无图片
编程学习 ·

钉钉dd.ready中不能调用方法解决,钉钉微应用遇到的坑

钉钉dd.ready中不能调用方法解决获取微应用免登授权码官方代码:dd.ready(function() {dd.runtime.permission.requestAuthCode({corpId: _config.corpId, // 企业idonSuccess: function (info) {code = info.code // 通过该免登授权码可以获取用户身份}}); });code虽然拿到了,…
暂无图片
编程学习 ·

面试常问的22个Linux命令

1.查找文件find / -name filename.txt根据名称查找/目录下的filename.txt文件。2.查看一个程序是否运行ps –ef|grep tomcat查看所有有关tomcat的进程3.终止线程kill -9 19979终止线程号位19979的线程4.查看文件,包含隐藏文件ls -al5.当前工作目录pwd6.复制文件包括其子文件到…
暂无图片
编程学习 ·

笔记:R输入文件数据处理txt, csv,画饼图

R输入文件数据处理txt, csv, xlsx 数据处理 1)获取文件类型 parts = strsplit(infile, split=".", fixed = TRUE) ftype = parts[[1]][length(parts[[1]])]2)根据文件类型选择输入方式 if (ftype == "csv"){loandata<<-data.frame(read.csv(infile…
暂无图片
编程学习 ·

zookeeper的安装及配置

zookeeper的安装及配置解压zookeeper压缩包 tar -xvf zookeeper-3.4.10.tar -C ~/softwares softwares是在~下自行创建的一个目录创建软连接 ln -s zookeeper-3.4.10/ zookeeper(方便以后更换)配置环境 进入~/.bashrc文件,配置环境变量 vi ~/.bashrc ####ZOOKEEPER_CONF####…
暂无图片
编程学习 ·

SQL函数

SQL拥有很多可用于计数和计算的内建函数。SQL Aggregat函数计算从列中取得的值,返回一个单一的值。有用的Aggregate函数如下:AVG() - 返回平均值COUNT() - 返回行数FIRST() - 返回第一个记录的值LAST() - 返回最后一个记录的值MAX() - 返回最大值MIN() - 返回最小值SUM() - 返…
暂无图片
编程学习 ·

寻找凸包(Graham扫描法)

寻找凸包(Graham扫描法)题意描述对任意给定的平面上的点集,求最小凸多边形使得点集中的点要么在凸多边形的边上,要么在凸多边形的内部。Graham算法描述 1、在所有的点中找到一点p0,使得p0的纵坐标值最小,在有多个最小纵坐标的情况下,找横坐标最小的那一个。 2、将所有的…
暂无图片
编程学习 ·

《advanced FPGA designed》ch7 example design:I2S versus SPDIF

七章:示例:I2S与SPDIFI2S格式以源同步的方式传输192 kHz采样率的音频数据。数据的样本大小可以是16位到24位,并且无论样本大小如何,都将其标准化为满量程幅度。由于信号是与源时钟一起发送的,因此可以使用源时钟轻松重建数据并随后进行重新同步。7.1总述I2S时序。7.1.1代码分…
暂无图片
编程学习 ·

Linux彻底卸载Nginx

本机环境:centos7使用yum安装的Nginx1.首先输入命令 ps -ef | grep nginx检查一下nginx服务是否在运行。[root@localhost /]# ps -ef |grep nginx root 3163 2643 0 14:08 tty1 00:00:00 man nginx root 5427 1 0 14:50 ? 00:00:00 nginx: m…
暂无图片
编程学习 ·

Java语言基础之封装&构造方法&静态的使用

面向对象思想概述 概述:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对象,强调具备功能的对象。 思想特点:面向对象思维方式是一种更符合人们思考习惯的思想 面向过程思维方式中更多的体现的是执行者(自己做事情),面向对象中更多…
暂无图片
编程学习 ·

面向对象到底是什么

面向对象编程OOP,全称 Object Oriented Programming两个基础概念:类(class)和对象(object)一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石面向对象编程语言OOPL,全称 Object Oriented Pro…
暂无图片
编程学习 ·

多线程编程六-线程池的使用

目录1 JDK自带的线程池2 七大参数简介:3 线程池工作流程4 自定义拒绝策略5 和spring整合6 合理配置线程数1 JDK自带的线程池我们知道JDK可以通过Executors类来创建线程池,但是这些线程池都有缺点,所以在生产环境中我们要自定义线程池来使用 Executors.newFixedThreadPool(),…
暂无图片
编程学习 ·

SpringBoot思维导图(SpringBoot基础部分汇总)

资源下载:https://download.csdn.net/download/qq_44895397/12561990 SpringBoot第一谈(第一个SpringBoot项目、核心配置文件properties(yml、yaml)、集成jsp) SpringBoot第二谈SpringBoot的web开发(集成MyBtis、SpringBoot 下的SpringMVC、SpringBoot开发RESTFul风格、集…