多线程---基础篇(二)

简介: 多线程---基础篇

Callable接口


步骤


实现callable接口,需要返回值类型

重写call方法,需要抛出异常

创建目标对象

创建执行服务:ExecutorService ser=Executors.newFixedThreadPool(3); //3个线程

提交执行:Future result1=ser.submit(t1);

获取结果:boolean r1=result1.get()

关闭服务:ser.shutdownNow()

好处:

可以定义返回值

可以抛出异常


代码示例


public class TestCallable implements Callable<Boolean> {
    private String url;//网络图片地址
    private String name;//保存文件名称
    public TestCallable (String url,String name){
        this.url=url;
        this.name=name;
    }
    //下载图片线程的执行体
    @Override
    public Boolean call() throws Exception {
        WebDownloader webDownloader=new WebDownloader();
        webDownloader.downloader(url,name);
        System.out.println("下载了文件名为:"+name);
        return true;
    }
    public static void main(String[] args) {
        TestCallable t1=new TestCallable("url地址","1.jpg");
        TestCallable t2=new TestCallable("url地址","1.jpg");
        TestCallable t3=new TestCallable("url地址","1.jpg");
        //创建执行服务
        ExecutorService ser=Executors.newFixedThreadPool(3);
        //提交执行
        Future<Boolean> r1=ser.submit(t1);
        Future<Boolean> r2=ser.submit(t1);
        Future<Boolean> r3=ser.submit(t1);
        //关闭服务
        ser.shutdownNow();
    }
}


多线程代码实例----龟兔赛跑


龟兔赛跑实例


public class Race implements Runnable{
    //胜利者
    private static String winner;
    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            //模拟兔子睡觉
            if(Thread.currentThread().getName().equals("兔子") && i%10==0){
                try{
                    Thread.sleep(1);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
            //判断比赛是否结束
            boolean flag=gameOver(i);
            //如果比赛结束了,就停止程序
            if(flag){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"===>跑了"+i+"步");
        }
    }
//判断是否完成比赛
    private boolean gameOver(int steps){
        //判断是否由胜利者
        if(winner!=null){
            return true;
        }{
            if(steps>=100){
                winner=Thread.currentThread().getName();
                System.out.println("winner is"+winner);
                return false;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        Race race = new Race();
        new Thread(race,"兔子").start();
        new Thread(race,"乌龟").start();
    }
}


d038476afb86ca0ca45e11b06fbd1dd7_e7a8f0dd2a2d44c1ba90cae122f9dc4d.png


总结


线程与进程的区别

进程是资源分配的最小单位,线程是CPU调度的最小单位。

一个进程包含一个或多个线程,它们共享进程的资源。

线程更轻量级,切换开销更小。

线程的基本使用

继承Thread类或者实现Runnable接口来创建线程类。

使用start()方法启动线程,而不是直接调用run()。

可以给线程设置优先级、守护线程等。

线程安全与同步

多线程访问共享资源需要考虑线程安全问题。

使用synchronized关键字或者Lock接口来对关键代码段加锁,保证同一时刻只有一个线程执行。

线程通信

wait/notify/notifyAll可以实现不同线程之间的通信。

join方法可以等待其他线程结束。

线程池的使用

线程池可以重用固定数量的线程,避免频繁创建销毁。

使用Executor框架中的线程池可以更好地控制线程池的属性。

常见的多线程问题

死锁、活锁、饥饿等问题及定位与解决。

以上是对多线程的一个基本认识,后续会持续更新~~

有不同见解可以指出一起学习~


相关文章
|
Linux
Linux:ln创建删除软连接
Linux:ln创建删除软连接
1919 0
|
10月前
|
机器学习/深度学习 存储 编解码
什么是图像噪声?是如何产生的?图像去噪技术都有哪些?
图像噪声是在图像采集、传输和处理过程中产生的像素值异常现象,主要由光子计数统计、电子偏移和放大器噪声等因素引起。噪声影响图像质量,降低信噪比,使特征难以识别。图像去噪技术包括传统方法(如空间域滤波、频域滤波、图像压缩和超糅合)和基于深度学习的方法(如卷积神经网络、残差网络和生成对抗网络),旨在有效去除噪声,提高图像质量。
|
人工智能 Serverless API
AI 绘画平台难开发,难变现?试试 Stable Diffusion API Serverless 版解决方案
AI 绘画平台难开发,难变现?试试 Stable Diffusion API Serverless 版解决方案
11977 132
|
文字识别 算法
印刷文字识别产品使用合集之支持识别图片吗
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
SQL 关系型数据库 MySQL
下一代实时数据库:Apache Doris 【四】扩容缩容
下一代实时数据库:Apache Doris 【四】扩容缩容
212 1
|
Java Spring 数据格式
Controller和RestController的区别
1. Controller, RestController的共同点      都是用来表示Spring某个类的是否可以接收HTTP请求   2.  Controller, RestController的不同点      @Controller:  标识一个Spring类是Spring MVC controller处理器      @RestController:    @RestController是@Controller和@ResponseBody的结合体,两个标注合并起来的作用。
7173 0
|
缓存 安全 Linux
自建iOS构建流水线建设核心原理剖析
文章主要从iOS打包机远程构建的角度分析,整体链路脚本涉及的shell、ruby、security指令、xml以及iOS工程化相关知识,文章通过一个远程构建流程简单并重点的讲解了如何规避本地打包环境下的小的修改出包存在的大量人工操作,如何动态化配置证书、版本号等信息以及内测分发方式的避坑点。
自建iOS构建流水线建设核心原理剖析
|
缓存 自然语言处理 Dubbo
深度剖析 Seata TCC 模式【图解 + 源码分析】
Seata 目前支持 AT 模式、XA 模式、TCC 模式和 SAGA 模式,之前文章更多谈及的是非侵入式的 AT 模式,今天带大家认识一下同样是二阶段提交的 TCC 模式。
951 0
深度剖析 Seata TCC 模式【图解 + 源码分析】
|
小程序 JavaScript 前端开发
微信小程序 | 酷炫时钟样式整理【附源码】
微信小程序 | 酷炫时钟样式整理【附源码】
766 0
微信小程序 | 酷炫时钟样式整理【附源码】
|
安全 NoSQL Java
JPA 的审计功能
简单介绍下JPA框架实现的审计功能