当前位置: 首页 > news >正文

Java基础:一文讲清多线程和线程池和线程同步

01-概述

在这里插入图片描述

02-线程创建

继承Thread

在这里插入图片描述

实现Runnable(任务对象)

在这里插入图片描述

实现Callable接口

在这里插入图片描述
在这里插入图片描述

public class ThreadDemo3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 目标:线程创建3
        // 需求:求1-100的和
        Callable<String> call = new MyCallable(100);

        // 创建FutureTask对象
        // 是Runnable对象
        FutureTask<String> task = new FutureTask<>(call);
        Thread t = new Thread(task);
        t.start();

        String result = task.get();
        System.out.println("最终执行结果:" + result);

    }
}

// 实现Callable接口
class MyCallable implements Callable<String> {
    private int n;
    public MyCallable(int n){
        this.n = n;
    }

    @Override
    public String call() throws Exception {
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum+=i;
        }
        return "子线程求和(1-" + n  + ")的结果是:" + sum;
    }
}

三种方式比对

在这里插入图片描述

03-Thead的常用方法

在这里插入图片描述
在这里插入图片描述

04-线程安全

什么是线程安全

在这里插入图片描述
在这里插入图片描述

程序模仿线程安全

在这里插入图片描述

public class Test {
    public static void main(String[] args) {
        // 目标:掌握线程安全问题
        // 1. 创建一个账户对象,两个人共享
        Account act = new Account("TCBC-001", 100);

        // 2.创建两个线程代表小明和小红,同时去取钱
        new DrawThread("小明", act).start();
        new DrawThread("小红", act).start();;


    }
}

class DrawThread extends Thread {
    private Account account;

    public DrawThread(String name ,Account account) {
        super(name);
        this.account = account;
    }

    @Override
    public void run() {
        // 小明、小红拿同一个账号对象acc取钱
        account.withdraw(100);
    }
}

public class Account {
    private String actId;
    private double money;

    // 取钱
    public void withdraw(double money) {
        String name = Thread.currentThread().getName();
        if (this.money < money){
            System.out.println(name + "取钱,余额不足,取不了");
            return;
        }

        System.out.println(name + "取钱,取了:" + money);// 模拟网络延迟

        this.money -= money;
        System.out.println(name + "取钱,剩余" + this.money);

    }

05-线程同步

认识线程同步

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法一:同步代码块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法二:同步方法

在这里插入图片描述
在这里插入图片描述

方法三:Lock

在这里插入图片描述

05-线程通信

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

06-线程池

认识线程池

在这里插入图片描述
在这里插入图片描述

如何创建线程池

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

线程池处理Runnable任务

在这里插入图片描述

public class ThreadPoolExcutorDemo1 {
    public static void main(String[] args) {
        // 1. 创建线程池对象
        ExecutorService pool = new ThreadPoolExecutor(3,5,1, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

        Runnable task = new MyRunnable();
        pool.execute(task);// 自动开启线程并处理
        pool.execute(task);
        pool.execute(task);
        pool.execute(task);// 复用线程

        // 生产不会关闭线程池
//        pool.shutdown();// 关闭
//        pool.shutdownNow();// 立即关闭

        pool.execute(task);
        pool.execute(task);
        pool.execute(task);// 线程4
        pool.execute(task);// 线程5
        pool.execute(task);// 线程6
        pool.execute(task);// 拒绝策略



    }
}

class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"正在执行");
        System.out.println(Thread.currentThread().getName()+"进入休眠");
        try {
            Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

线程池处理Callable任务

public class ThreadPoolExcutorDemo3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 1. 创建线程池对象
        ExecutorService pool = new ThreadPoolExecutor(3,5,1, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

        // 创建FutureTask对象
        // 是Runnable对象
        Future<Integer> f1 = pool.submit(new MyCallable3(0,50));// 自动开启线程并处理
        Future<Integer> f2 = pool.submit(new MyCallable3(50,101));

        Integer result1 = f1.get();
        System.out.println(result1);

        Integer result2 = f2.get();
        System.out.println("1-100和" + (result1 + result2));



    }
}

// 实现Callable接口
class MyCallable3 implements Callable<Integer> {
    private int n;
    private int m;
    public MyCallable3(int n,int m){
        this.n = n;
        this.m = m;
    }

    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = n; i < m; i++) {
            sum+=i;
        }
        return sum;
    }
}

Executors工具类实现线程池

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

07-其它:并发、并行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

08-其它:生命周期

在这里插入图片描述
在这里插入图片描述

相关文章:

  • 通过扣子平台工作流将数据写入飞书多维表格
  • TDengine 语言连接器(Go)
  • Android 之美国关税问题导致 GitHub 403 无法正常访问,责任在谁?
  • leetcode-单调栈26
  • 开源项目介绍:GroundingDINO-TensorRT-and-ONNX-Inference
  • 2003-2016年各省互联网普及率数据
  • Ubuntu系统美化
  • 雅思练习总结(二十六)
  • defer关键字
  • RVOS-4.实现上下文切换和协作式多任务
  • 力扣每日打卡 50. Pow(x, n) (中等)
  • 玩转Docker | 使用Docker部署PDF阅读器PdfDing
  • JavaScript:BOM编程
  • 【吾爱出品】[Windows] 鼠标或键盘可自定义可同时多按键连点工具
  • 【Game】Powerful——Equipments
  • Kubernetes控制平面组件:APIServer 准入控制机制详解
  • Visual Studio Code 开发 树莓派 pico
  • 深入浅出一下Python面向对象编程的核心概念与实践应用
  • FPGA时序分析与约束(11)——时钟组
  • instructor 实现 reranker 功能
  • 完善劳动关系协商协调机制,《共同保障劳动者合法权益工作指引》发布
  • 南宁海关辟谣网传“查获600公斤稀土材料”:实为焊锡膏
  • 释新闻|拜登确诊恶性前列腺癌,预后情况如何?
  • 西浦国际教育创新论坛举行,聚焦AI时代教育本质的前沿探讨
  • 陕西:未来一周高温持续,继续发布冬小麦干热风风险预警
  • 蔡建忠已任昆山市副市长、市公安局局长