【JavaSE】多线程(学习笔记)

一、多线程概述

  1. 进程:正在运行的程序
    1. 系统进行资源分配粒调用的独立单位
    2. 每一个进程都有它自己的内存空间和系统资源
  2. 线程:进程中的单个顺序控制流,是一条执行路径
    1. 单线程:一条执行路径
    2. 多线程:多条执行路径

二、多线程的实现

1、继承Thread类

1)使用

重写run()方法,调用start()方法

  • run():封装线程执行的代码
  • start():执行线程,jvm虚拟机调用run()方法
2)设置/获取线程名称

void setName(String name):改线程名

String getName():返回线程名

构造方法设置线程名称 --> 子类需写带参构造方法

public 类名(String s){
    super(s);
}

public static Thread currentThread():获取对当前正在执行的线程对象的引用

Tread.currentThread().getName();

2、实现Runnable接口

1)使用
  1. 定义类实现Runnable接口,重写run()方法,并创建对象
  2. 创建Thread对象,让类的对象传入
    1. Thread(Runnable target)
    2. Thread(Runnable target, String name)
  3. 启动线程
2)优点

方便继承别的类

多个线程访问一个资源

三、线程优先级

1、线程调度

分时调度模型:线程轮流使用CPU ,平均分配cpu时间片

抢占式调度模型:优先让优先级高的线程使用CPU,优先级相同则随机分配

Java使抢占式调度模型,线程执行具有随机性

2、查询/设置优先级

public final int getPriority():返回此线程的优先级

public final void setPriority(int newPriority):更改此线程的优先级

  • 最大10
  • 最小1
  • 默认5

四、线程控制

  1. static void sleep(long millis):使当前正在执行的线程停留(暂停执行)指定的毫秒数
  2. void join():等待这个线程死亡 --> 使其线程独占
  3. void setDaemon(boolean on):标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
    1. boolean on:true开启,false关闭
    2. 不会立即退出

五、线程生命周期

  1. 创建对象:new()
  2. 有资格,没权利:start()
  3. 有资格,有权利运行:抢到了cpu资源
    1. 阻塞:sleep()
    2. 结束:stop()

六、线程同步

1、数据安全问题

1)原因

1、多线程环境

2、有共享数据

3、有多条语句操作共享数据

2)解决方法

不允许多线程共同操作共享数据

2、同步代码块

synchronized(任意对象) {
    多条语句操作共享数据的代码
}

synchronized(任意对象):任意对象就可以看成是一把锁/钥匙

3、同步方法

1)同步方法

格式:修饰符 synchronized 返回值类型 方法名(方法参数){}

锁/钥匙:this

2)同步静态方法

格式:修饰符 static synchronized 返回值类型 方法名(方法参数){}

锁/钥匙:类名.class

4、线程安全类

  1. StringBuffer:线程安全的StringBuilder
  2. Vector:线程安全的ArrayList
  3. Hashtable:线程安全的HashMap
  4. 返回线程安全的列表
// 定义
static <T> List<T> synchronized (List<T> list)
// 实例
List<Integer> list = Collections.synchronizedList(new ArrayList<>());

5、Lock锁

1)间接实例化

private Lock lock = new ReentrantLock;

2)获得锁

void lock()

3)关闭锁

void unlock()

七、生产者消费者模型

1、概述

生产者 --> 共享数据区域 <—消费者

2、Object类的等待唤醒方法

  1. void wait():当前线程等待
  2. void notify():唤醒正在等待对象监视器的单个线程
  3. void notifyAll():唤醒所有线程

3、使用注意

  1. wait()notify()/notifyAll()成对出现
  2. 加入boolean state变量判断等待与唤醒

4、代码实现

public class Box {
    private int milk;
    private boolean state = false;

    public synchronized void put(int milk) {
        if(state){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.milk = milk;
        System.out.println("送第" + this.milk + "瓶奶");
        state = true;
        notifyAll();
    }
    public synchronized void get(){
        if(!state) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("取第" + milk + "瓶奶");
        state = false;
        notifyAll(); 
    }
}
public class Customer implements Runnable{
    private Box b;

    public Customer(Box b) {
        this.b = b;
    }

    @Override
    public void run() {
        while(true){
            b.get();
        }
    }
}
public class Producer implements Runnable {
    private Box b;

    public Producer(Box b) {
        this.b = b;
    }

    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            b.put(i);
        }
    }
}
public class BoxDemo {
    public static void main(String[] args) {
        Box b = new Box();
        Customer c = new Customer(b);
        Producer p = new Producer(b);

        Thread t1 = new Thread(c);
        Thread t2 = new Thread(p);

        t1.start();
        t2.start();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/218262.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20种常用的软件测试方法,建议先收藏再观看

软件测试在完整的项目当中算是最后一个环节&#xff0c;也是非常重要的一个环节。通过软件测试&#xff0c;我们才能得知一个程序是否符合标准。 小编整理出20种常见的软件测试方法&#xff0c;建议伙伴们先收藏再看。不敢说史上最全&#xff0c;但我办公室里十年软件测试经验…

EasyRecovery2024免费永久版手机数据恢复软件

EasyRecovery2024是一款操作安全、用户可自主操作的数据恢复方案&#xff0c;它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、闪存、硬盘、光盘、U盘/移动硬盘、数码相机、手机以及其它多媒体移动设备。能恢…

某60区块链安全之JOP实战一学习记录

区块链安全 文章目录 区块链安全Jump Oriented Programming实战一实验目的实验环境实验工具实验原理实验内容Jump Oriented Programming实战一 实验步骤分析合约源代码漏洞Jump Oriented Programming实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约中中Ju…

【Windows】永久屏蔽系统更新

永久关闭电脑更新服务 操作思路&#xff1a; 第一步 winR 输入 services.msc 回车 进入服务管理窗口第二步 进入窗口后 找到 w 开头的文件夹 并找到Windows Update 双击打开 Windows Update 将启动类型&#xff08;E&#xff09; 改为禁用 上方的 “常规” “登录” “恢…

异常处理 springboot

全局异常处理 RestcontrollerAdvice Exceptonhandler package com.it.Exception;import com.it.pojo.Result; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice;/*全局异常处理器…

[HTML]Web前端开发技术7(HTML5、CSS3、JavaScript )CSS的定位机制——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

webGL开发虚拟实验室技术方案

开发虚拟实验室涉及到模拟实际实验环境和过程&#xff0c;同时提供用户互动性和学习体验。以下是一个可能的技术方案&#xff0c;用于实现这样的虚拟实验室&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

事务管理 springboot

事务是一组操作的集合 它是一个不可分割的工作单位 这些操作 要么同时成功要么同时失败 Spring事务管理 #Spring事务管理日志 logging: level: org.springframework.jdbc.support.JdbcTransactionManager: debug

内网穿透的应用-公网环境下移动端通过群晖管家+cpolar远程管理家中本地局域网内黑群晖设备

白嫖怪狂喜&#xff01;黑群晖也能使用群晖管家啦&#xff01; 文章目录 白嫖怪狂喜&#xff01;黑群晖也能使用群晖管家啦&#xff01;1.使用环境要求&#xff1a;2.下载安装群晖管家app3.随机地址登陆群晖管家app4.固定地址登陆群晖管家app 自己组装nas的白嫖怪们虽然也可以通…

基于SSM框架的《超市订单管理系统》Web项目开发(第五天)供应商管理,增删改查

基于SSM框架的《超市订单管理系统》Web项目开发&#xff08;第五天&#xff09;供应商管理&#xff0c;增删改查 上一次我们实现了多表关联查询&#xff0c;还有分页显示数据的功能。还完善了用户管理这一模块。 因此今天我们需要完成的是供应商管理模块&#xff0c;这一模块…

简单了解传输层协议之TCP和UDP

目录 一、什么是端口号? 二、TCP协议 2.1 TCP报文格式 2.2 三次握手 2.3 四次挥手 2.4 窗口流量控制 三、UDP协议 3.1 UDP报文格式 3.4 传输过程 一、什么是端口号? 我们自己的一台电脑上有时可能会同时运行多个进程软件来进行上网。那么当网络上的服务器响应我们电…

3 开发环境搭建

一、Ubuntu和Windows文件互传 ① 开启Ubuntu的FTP服务&#xff1a; 下载vsftpd&#xff1a;sudo apt-get install vsftpd; 打开vsftpd.conf&#xff1a;sudo nvim /etc/vsftpd.conf; 确保这两行代码没有被注释&#xff1a; 之后重启FTP服务&#xff1a; ② Windows下载FTP客…

LinuxBasicsForHackers笔记 -- 控制文件和目录权限

对于每个文件和目录&#xff0c;我们可以指定文件所有者、特定用户组以及所有其他用户的权限状态。 不同类型的用户 在Linux中&#xff0c;root用户是拥有一切权力的。 root 用户基本上可以在系统上执行任何操作。 系统上的其他用户具有有限的能力和权限&#xff0c;并且几乎…

为什么 SQL 不适合图数据库

背景 “为什么你们的图形产品不支持 SQL 或类似 SQL 的查询语言&#xff1f;” 过去&#xff0c;我们的一些客户经常问这个问题&#xff0c;但随着时间的推移&#xff0c;这个问题变得越来越少。 尽管一度被忽视&#xff0c;但图数据库拥有无缝设计并适应其底层数据结构的查询…

nodejs微信小程序+python+PHP就业求职招聘信息平台的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之文件管理(1)》(22)

《Linux操作系统原理分析之文件管理&#xff08;1&#xff09;》&#xff08;22&#xff09; 7 文件管理7.1 文件与文件系统7.1.1 文件7.1.3 文件系统及其功能 7.2 文件的组织结构7.2.1 文件的逻辑结构7.2.2 文件的物理结构一、顺序结构&#xff08;顺序文件或连续文件&#xf…

微信小程序uni.chooseImage()无效解决方案

Bug场景&#xff1a; 微信小程序在上传图片时可以通过 uni.chooseImage()方案进行上传&#xff0c;这里不再赘述具体参数。一直项目都可以正常使用&#xff0c;突然有一天发现无法使用该方法&#xff0c;于是查了一下&#xff0c;发现是用户隐私协议问题。故记录一下解决方案。…

Linux中的网络配置

本章主要介绍网络配置的方法 网络基础知识查看网络信息图形化界面修改通过配置文件修改 1.1 网络基础知识 一台主机需要配置必要的网络信息&#xff0c;才可以连接到互联网。需要的配置网络信息包括IP、 子网掩码、网关和 DNS 1.1.1 IP地址 在计算机中对IP的标记使用的是3…

逻辑回归 使用Numpy实现逻辑回归

使用Numpy实现逻辑回归 sigmoid 函数 g ( z ) 1 ( 1 e − z ) g(z)\frac{1}{(1e^{−z} )} g(z)(1e−z)1​ # sigmoid 函数 def sigmod(z):return 1/(1np.exp(-z))线性计算与梯度下降 J ( θ ) − 1 m [ ∑ i 1 m y ( i ) l o g ⁡ ( h θ ( x ( i ) ) ) ( 1 − y ( i ) …