【JavaSE线程知识总结】

多线程

  • 一.创建线程
    • 1.多线程创建方式一(Thread)
    • 2.多线程创键方式二(Runnable)
    • 3.线程创建方式三
  • 二.线程安全问题
    • 解决办法
      • 1.使用同步代码块synchornized
    • 2 .使用Lock解决线程安全问题
  • 三.总结

  • 线程就是程序内部的一条执行流程

一.创建线程

常用的方法

  • Thread.currentThread(): 获取当前线程
  • Thread.getName(): 获取当前线程的名称
  • Thread.setName(): 设置当前线程的名称
  • Thread.yield(): 礼让当前正在执行的线程
  • Thread.sleep(long millis): 让当前线程暂停millis毫秒
  • Thread.interrupt(): 中断当前线程
  • Thread.isInterrupted(): 判断当前线程是否被中断
  • Thread.currentThread().interrupt(): 中断当前线程
  • Thread.join(): 插队,调用这个方法的线程先执行完毕
  • Thread.sleep()睡眠

1.多线程创建方式一(Thread)

  • 定义一个子类MyThread继承Thread,重写run方法
  • 创建Mythread类的对象
  • 通过对象调用start方法启动线程,线程开启后,会自动调用线程对象的run方法执行
  • JVM会自动开启一个线程,执行main方法,称为主线程
  • 主线程中开启了其他线程称为子线程
  • 开启了子线程后,子线程会跟我们的主线程争抢资源,谁抢到了谁就先执行,执行一小会用释放,再重新抢占资源
    优点: 创建线程简单
    缺点: 扩展性不强,不能返回线程执行结果
    在这里插入图片描述
    在这里插入图片描述

2.多线程创键方式二(Runnable)

  • 定义一个线程任务类MyRunnable实现Runnable接口,重写run()方法
  • 创建MyRunnable任务对象
  • 把MyRunnable对象交给Thread处理
  • 调用start()方法启动线程

优点
线程任务与线程对象分离,可以让同一线程执行不同的任务
缺点
需要多一个Runnable对象
不能返回线程结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.线程创建方式三

  • 实现callable<返回值类型>接口,重写call方法
  • callable接口在实现的时候需要指定泛型,用来确定返回值的数据类型
  • 创建FutureTask对象,构造方法中需要传入callable接口实现类对象
  • FutureTask()中提供了一个get(),它是一个阻塞的方法,他会阻塞线程一直从Futurue对象中去获取返回的结果,如果没有获取到会一致阻塞等待
  • 创建Thread对象,构造方法中传入futureTask对象
  • 调用start()方法启动线程
  • 调用get()方法的时候会有异常(最好分开进行try… catch异常捕获,因为当有一条线程出现异常的时候,不会影响到其他线程的返回结果,)
package com.dream.Thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class ThreadDemo03 {
    public static void main(String[] args) {
        //1.线程创建的方式三: 实现callable接口,重写call方法
        //callable接口在实现的时候需要指定泛型,用来确定返回值的数据类型
        //2.创建callable接口实现类的对象
        MyThread3 myThread3 = new MyThread3(100);
        //3.创建FutureTask对象,构造方法中需要传入callable接口实现类对象
        FutureTask<String> futureTask = new FutureTask<>(myThread3);
        //futureTask对象是线程任务对象,他的get方法可以在线程运行结束后,获取线程执行结果
        //4.创建Thread对象,构造方法中传入futureTask对象
        Thread t = new Thread(futureTask);
        //5.启动线程
        t.start();


        MyThread3 myThread3_2 = new MyThread3(200);
        FutureTask<String> futureTask_2 = new FutureTask<>(myThread3_2);
        Thread t2 = new Thread(futureTask_2);
        t2.start();


        //6.获取线程执行结果(最好分开进行try... catch异常捕获,因为当有一条线程出现异常的时候,不会影响到其他线程的返回结果,)
        try {
            String result = futureTask.get();
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            String result_2 = futureTask_2.get();
            System.out.println(result_2);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}


class MyThread3 implements Callable<String> {
    private int n;

    public MyThread3(int n) {
        this.n = n;
    }

    @Override
    public String call() throws Exception {
        //计算1-n的和返回
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += i;
        }
        return "1-" + n + "的和为:" + sum;
    }
}

二.线程安全问题

  • 存在多个线程在同时执行
  • 同时访问一个共享资源
  • 同时对共享资源做操作

比如两个人访问同一个银行账户,就会出现线程安全问题

package com.dream.threadsafe;

public class MyRunnable implements Runnable {
    private Account account = new Account();

    @Override
    public void run() {

        if (account.getBalance() >= 100000) {
            account.withdraw(account, 100000);
        } else {
            System.out.println("余额不足,取款失败");
        }
        
    }
}

/**
 * 模拟取款
 */

class Account {
    private int balance = 100000;// 余额

    public int getBalance() {
        return balance;
    }

    public void withdraw(Account acc, int amount) {
        System.out.println(Thread.currentThread().getName() + "正在取款" + amount);
        balance -= amount;
        System.out.println(Thread.currentThread().getName() + "取款成功,余额为" + balance);
    }
}

启动线程

public class Test {
    public static void main(String[] args) {
        MyRunnable mr = new MyRunnable();
        Thread t1 = new Thread(mr, "小明");
        Thread t2 = new Thread(mr, "小红");
        t1.start();
        t2.start();
    }
}

解决办法

1.使用同步代码块synchornized

  • 同步锁:我们传入的参数要是唯一的对象,
  • 但是不要直接使用字符串作为锁对象,因为会导致其它无关线程不能同步线程
  • 如果同步锁对象是在实例方法内部,那么锁对象就是this
  • 每次抢占到资源都会判断当前锁是否是开启的,开启了就进入执行,关闭则等待
  • 如果同步锁对象是在静态方法内部,那么锁对象就是 类名.class
  • 也可以直接加在方法的修饰符后面,构成同步方法
    在这里插入图片描述
    在这里插入图片描述

2 .使用Lock解决线程安全问题

  • Lock是一个接口,需要创建它的实现类对象ReentranLock()是Lock接口的实现类
  • 相较于synchronized锁,Lock会更加的灵活
  • 他俩都属于重量级锁
private final Lock lk = new ReentrantLock();
public void withdraw(Account acc, double money) {
        lk.lock();//上锁
        try {
            if (this.money >= money) {
                //余额足够,取款
                System.out.println(Thread.currentThread().getName() + "取款成功");
                //更新余额
                this.money -= money; //
                System.out.println(acc.getCardId() + "余额为:" + this.money);
            } else {
                System.out.println("余额不足");
                System.out.println(Thread.currentThread().getName() + "取款失败");
            }
        } finally {
            lk.unlock();//解锁
        }

    }

三.总结

本章主要讲解了线程几种线程的创建方式,线程安全问题出现的场景,以及线程安全的解决方式

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

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

相关文章

用OMS进行 OceanBase 租户间数据迁移的测评

基本概念 OceanBase迁移服务&#xff08;&#xff0c;简称OMS&#xff09;&#xff0c;可以让用户在同构或异构 RDBMS 与OceanBase 数据库之间进行数据交互&#xff0c;支持数据的在线迁移&#xff0c;以及实时增量同步的复制功能。 OMS 提供了可视化的集中管控平台&#xff…

第一个 Flutter 项目(1)共46节

前端开发工具vs code&#xff0c;安装Flutter sdk&#xff0c;如果你的下载速度比较慢&#xff0c;可以选择这个&#x1f604; flutter sdk 解压码&#xff1a;stwq 配置可以看这Flutter 新建工程一直等待 解决办法-CSDN博客 如果你是新的 Flutter 开发者&#xff0c;我们建…

POI实现根据PPTX模板渲染PPT

目录 1、前言 2、了解pptx文件结构 3、POI组件 3.1、引入依赖 3.2、常见的类 3.3、实现原理 3.4、关键代码片段 3.4.1、获取ppt实例 3.4.2、获取每页幻灯片 3.4.3、循环遍历幻灯片处理 3.4.3.1、文本 3.4.3.2、饼图 3.4.3.3、柱状图 3.4.3.4、表格 3.4.3.5、本地…

高级数据结构——hash表与布隆过滤器

文章目录 hash表与布隆过滤器1. hash函数2. 选择hash函数3. 散列冲突3.1 负载因子3.2 冲突解决3. STL中的散列表 4. 布隆过滤器4.1 背景1. 应用场景2. 常见的处理场景&#xff1a; 4.2 布隆过滤器构成4.3 原理4.4 应用分析4.5 要点 5. 分布式一致性hash5.1 缓存失效问题 6. 大数…

小程序19-微信小程序的样式和组件介绍

在小程序中不能使用 HTML 标签&#xff0c;也就没有 DOM 和 BOM&#xff0c;CSS 也仅支持部分选择器 小程序提供了 WXML 进行页面结构的编写&#xff0c;WXSS 进行页面的样式编写 WXML 提供了 view、text、image、navigator等标签构建页面结构&#xff0c;小程序中标签称为组件…

[Linux]多线程详解

多线程 1.线程的概念和理解1.1线程的优点1.2线程的缺点1.3线程的设计1.4线程 VS 进程 2.线程控制2.1线程等待2.2 线程终止2.3 线程分离 3.线程互斥3.1背景3.2抢票代码演示3.3保护公共资源&#xff08;加锁&#xff09;3.3.1创建锁/销毁锁3.3.2申请锁/尝试申请锁/解锁 3.4解决抢…

CSP-J 2024题解

省流&#xff1a;300->260 乐。 Poker: 我考场上寻思着会不会有人写成了 joker.in joker.out&#xff0c;结果真的有 joker Sol EZ problem&#xff0c;拿 set 搞一下就行了&#xff08;虽然我赛事没想到&#xff0c;用了 map&#xff09; Code #include <bits/std…

【miniMax开放平台-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

python机器人Agent编程——多Agent框架的底层逻辑(上)

目录 一、前言二、两个核心概念2.1 Routines&#xff08;1&#xff09;清晰的Prompt&#xff08;2&#xff09;工具调用json schema自动生成&#xff08;3&#xff09;解析模型的toolcall指令&#xff08;4&#xff09;单Agent的循环决策与输出 PS.扩展阅读ps1.六自由度机器人相…

达梦 DG

监视器 switchover 关于达梦DG switchover的细节&#xff0c;以下是一些关键步骤和注意事项&#xff1a; • 切换前检查确认&#xff1a; • 确认数据库版本和DG架构&#xff0c;包括IP信息及切换角色前后的情况。 • 检查DG切换方式&#xff0c;是switch over还是fail ove…

blind-watermark - 水印绑定

文章目录 一、关于 blind-watermark安装 二、bash 中使用三、Python 调用1、基本使用2、attacks on Watermarked Image3、embed images4、embed array of bits 四、并发五、相关 Project 一、关于 blind-watermark Blind watermark 基于 DWT-DCT-SVD. github : https://githu…

从零开始的c++之旅——二叉搜索树

1、二叉搜索树概念 1. ⼆叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 • 若它的右⼦树不为空&#xff0c;则右⼦树上所有结…

类与对象;

目录 一、认识类&#xff1b; 1、类的引入&#xff1b; 2、类的定义&#xff1b; 类的两种定义方式&#xff1a; 3、类的访问限定符及封装&#xff1b; 4、类的作用域&#xff1b; 5、类的实例化&#xff1b; 6、类对象模型&#xff1b; 计算类对象的大小&#xff1b; …

ceph的集群管理

0 环境说明 ip地址主机名额外硬盘是否加入ceph集群10.0.0.141ceph141sdb 300G&#xff0c;sdc 500G是10.0.0.142ceph142sdb 300G&#xff0c;sdc 500G, sdd 1000G否10.0.0.143ceph143sdb 300G&#xff0c;sdc 500G否 在上一篇文章中&#xff0c;已经成功地初始化了一个ceph管…

企业无线解决方案

前言 无线广域网 无线广域网WWAN&#xff08;Wireless Wide Area Network&#xff09;目前已经成为了全球通信系统的核心组成部分&#xff0c;我们所熟悉的2G网络、3G网络和4G网络&#xff08;LTE&#xff09;等等都是WWAN的典型代表。通过WWAN&#xff0c;用户几乎可以在任何…

Springboot集成ElasticSearch实现minio文件内容全文检索

一、docker安装Elasticsearch &#xff08;1&#xff09;springboot和Elasticsearch的版本对应关系如下&#xff0c;请看版本对应&#xff1a; 注意安装对应版本&#xff0c;否则可能会出现一些未知的错误。 &#xff08;2&#xff09;拉取镜像 docker pull elasticsearch:7…

前后端请求响应

引入 在之前的例子中&#xff0c;我们编写了一个简单的web类&#xff0c;我们运行启动类&#xff0c;启动内嵌的tomcat后就可以在浏览器通过特定的路径访问tomcat中的应用程序。 但之前编写的程序仅仅是个简单的java类&#xff0c;其并未实现某个接口或继承某个类&…

VS2022编译32位OpenCV

使用环境 Visual Studio 2022 OpenCV: 4.7.0 cmake: 3.30.2一、使用CMake工具生成vs2022的openCV工程解决方案 打开cmake&#xff0c;选择opencv的源代码目录&#xff0c;创建一个文件夹&#xff0c;作为VS工程文件的生成目录 点击configure构建项目&#xff0c;弹出构建设置…

电子应用设计方案-12:智能窗帘系统方案设计

一、系统概述 本设计方案旨在打造便捷、高效的全自动智能窗帘系统。 二、硬件选择 1. 电机&#xff1a;选用低噪音、扭矩合适的智能电机&#xff0c;根据窗帘尺寸和重量确定电机功率&#xff0c;确保能平稳拉动窗帘。 2. 轨道&#xff1a;选择坚固、顺滑的铝合金轨道&…

MySQL系统优化

文章目录 MySQL系统优化第一章&#xff1a;引言第二章&#xff1a;MySQL服务架构优化1. 读写分离2. 水平分区与垂直分区3. 缓存策略 第三章&#xff1a;MySQL配置优化1. 内存分配优化Buffer Pool 的优化查询缓存与表缓存Key Buffer 2. 连接优化最大连接数会话超时连接池 3. 日志…