java多线程及

多线程使用

在java中,多线程得主要实现方式有四种:继承Thread类,实现Runnable接口、实现callable接口通过FutureTask包装器来创建Thread线程,使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,而后两种是带返回值的。除此之外,通过Timer启动定时任务,或者通过像Spring Task和quartz这样的第三方任务调度框架也可以开启多线程任务

继承Thread类创建线程

Thread类本质上也是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程比较简单,通过继承Thread类并复写run()方法,就可以启动新线程并执行自己定义的run()方法

public class ThreadDemo extends Thread {
    
    public ThreadDemo(String name) {
        // 设置当前线程的名字
        this.setName(name);
    }
    
    @Override
    public void run() {
        System.out.println("当前运行的线程名为: " + Thread.currentThread().getName());
    }
    
    public static void main(String[] args) throws Exception {
        // 注意这里,要调用start方法才能启动线程,不能调用run方法
        new ThreadDemo("MyThreadOne").start();
        new ThreadDemo("MyThreadTwo").start();
        
    }
    
}

输出结果:

复制代码
当前运行的线程名为: MyThreadOne
当前运行的线程名为: MyThreadTwo
实现Runnable接口创建线程

由于Java是单继承机制,如果自己的类已经继承自另一个类,则无法再直接继承Thread类,此时,可以通过实现Runnable接口来实现多线程。

实现Runnable接口并实现其中的run方法,然后通过构造Thread实例,传入Runnable实现类,然后调用Thread的start方法即可开启一个新线程。

public class MyRunnable implements Runnable {
    
    @Override
    public void run() {
        System.out.println("当前运行的线程名为: " + Thread.currentThread().getName());
    }
    
    public static void main(String[] args) throws Exception {
        MyRunnable runnable = new MyRunnable();
        new Thread(runnable, "MyThreadOne").start();
        new Thread(runnable, "MyThreadTwo").start();
        
    }
    
}

输出结果:

复制代码
当前运行的线程名为: MyThreadOne
当前运行的线程名为: MyThreadTwo
线程池使用

线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批线程,当有需要使用线程时从线程池取出,用完后放回线程池,这样避免了频繁创建与销毁线程。

核心参数

线程池的核心参数决定了池的类型,进而决定了池的特性。

参数 解释 行为
corePoolSize 核心线程数 池中长期维护的线程数量,不主动回收
maximumPoolSize 最大线程数 最大线程数大于等于核心线程数
keepAliveTime 线程最大空闲时间 非核心线程最大空闲时间,超时回收线程
workQueue 工作队列 工作队列直接决定线程池的类型

Executors类默认创建线程池与参数对应关系。

线程池 corePoolSize maximumPoolSize keepAliveTime workQueue
newCachedThreadPool 0 Integer.MAX_VALUE 60 SynchronousQueue
newSingleThreadExecutor 1 1 0 LinkedBlockingQueue
newFixedThreadPool N N 0 LinkedBlockingQueue
newScheduledThreadPool N Integer.MAX_VALUE 0 DelayedWorkQueue
线程池对比
线程池 特点 适用场景
newCachedThreadPool 超时未使用的线程回自动销毁,有新任务时自动创建 适用于低频、轻量级的任务。回收线程的目的是节约线程长时间空闲而占有的资源。
newSingleThreadExecutor 线程池中有且只有一个线程 顺序执行任务
newFixedThreadPool 线程池中有固定数量的线程,且一直存在 适用于高频的任务,即线程在大多数时间里都处于工作状态。
newScheduledThreadPool 定时线程池 与定时调度相关联

https://segmentfault.com/a/1190000041661118

java线程池最全的面试题(仔细揣摩整理)

相关推荐
武子康9 分钟前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
若亦_Royi10 分钟前
C++ 的大括号的用法合集
开发语言·c++
资源补给站1 小时前
大恒相机开发(2)—Python软触发调用采集图像
开发语言·python·数码相机
豪宇刘1 小时前
MyBatis的面试题以及详细解答二
java·servlet·tomcat
秋恬意1 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
m0_748247551 小时前
Web 应用项目开发全流程解析与实战经验分享
开发语言·前端·php
6.942 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
FF在路上2 小时前
Knife4j调试实体类传参扁平化模式修改:default-flat-param-object: true
java·开发语言
真的很上进2 小时前
如何借助 Babel+TS+ESLint 构建现代 JS 工程环境?
java·前端·javascript·css·react.js·vue·html
众拾达人3 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言