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

线程-线程的创建方式与线程池基础知识

创建线程有四种方式,继承Thread类、实现Runnable接口、实现Callable接口、线程池创建线程,常用的还是线程池创建线程。

1.继承Thread类

自定义类MyThread(叫什么都行)去extends Thread

重写里面的run方法,new MyThread()去创建多个MyThread对象t1、t2、....

调用start方法启动线程t1.start()、...

public class MyThread extends Thread {
@Override
public void run() {
System.out.println("MyThread...run...");
}
public static void main(String[] args) {
// 创建MyThread对象
MyThread t1 = new MyThread() ;
MyThread t2 = new MyThread() ;
// 调用start方法启动线程
t1.start();
t2.start();
}
}

2.实现Runnable接口

自定义类MyRunnable去implement实现Runnable

重写里面的run方法,创建MyRunnable对象mr,再根据MyRunnable对象创建Thread对象

new Thread(mr)创建t1、t2、....

再调用start方法启动线程t1.start()、...

相比上个步骤就多个创建MyRunnable对象

public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("MyRunnable...run...");
}
public static void main(String[] args) {
// 创建MyRunnable对象
MyRunnable mr = new MyRunnable() ;
// 创建Thread对象
Thread t1 = new Thread(mr) ;
Thread t2 = new Thread(mr) ;
// 调用start方法启动线程
t1.start();
t2.start();
}
}

3.实现Callable接口

自定义类MyCallable去implement实现 Callable<里面返回值类型>

重写call()方法,(这里不是重写run方法),需return 返回值(按返回值类型返回)

创建MyCallable对象mc,在根据mc创建未来值对象,new FutureTask<返回值类型>(mc)创建未来值ft,再根据未来值创建线程,new Thread(ft),再调用start方法启动即可,并且可通过未来值ft的get方法获取执行结果

public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("MyCallable...call...");
return "OK";
}
public static void main(String[] args) throws
ExecutionException, InterruptedException {
// 创建MyCallable对象
MyCallable mc = new MyCallable() ;
// 创建F
FutureTask<String> ft = new FutureTask<String>(mc) ;
// 创建Thread对象
Thread t1 = new Thread(ft) ;
Thread t2 = new Thread(ft) ;
// 调用start方法启动线程
t1.start();
// 调用ft的get方法获取执行结果
String result = ft.get();
// 输出
System.out.println(result);
}
}

4.利用线程池工具类创建线程

public class MyExecutors implements Runnable{
@Override
public void run() {
System.out.println("MyRunnable...run...");
}
public static void main(String[] args) {
ExecutorService threadPool =
Executors.newFixedThreadPool(3);
threadPool.submit(new MyExecutors()) ;
// 关闭线程池
threadPool.shutdown();
}
}

Executors是线程的工具类,有很多静态方法可以创建线程池对象,但是底层都是通过线程池的实现类ThreadPoolExecutor创建线程池对象,但是使用工具类创建线程池对象存在系统风险.

利用ThreadPoolExecutor创建线程池

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

线程池在创建的时候最大支持传入7个参数,分别是:1.核心线程数  2.最大线程数 3.临时线程空闲时间 4.临时线程空闲时间单位 5.工作队列 6.创建线程的工厂 7.线程池拒绝策略

其中工作队列又叫阻塞队列,指的是当核心线程数已满,新任务到达时,存储线程的队列,常见的有下面几种:基于数组结构的有界阻塞队列ArrayBlockingQueue、基于链表结构的有界阻塞队列LinkedBlockingQueue、具有有限级别的阻塞队列PriorityBlockingQueue、不储存元素的阻塞队列,每个插入操作都必须等待一个移出操作SynchronousQueue

拒绝策略是指把任务添加到线程池,线程池拒绝该策略所采取的相应策略,官方提供了4种:默认策略,直接抛出异常AbortPolicy、调用者所在线程来执行任务CallerRunsPolicy、丢弃阻塞队列中最靠前的任务并执行当前任务DiscardOldestPolicy、直接丢弃任务DiscardPolicy


http://www.kler.cn/news/234936.html

相关文章:

  • golang常用库之-操作数据库ORM:GORM 包介绍 | 一些 GORM 提示和注意事项
  • 3分钟部署完成Docker Registry及可视化管理工具Docker-UI
  • AI大模型学习笔记之四:生成式人工智能(AIGC)是如何工作的?
  • Java String源码剖析+面试题整理
  • 第三百一十回
  • 《21天精通IPv4 to IPv6》第10天:IPv6在物联网中的应用——如何在物联网中应用IPv4到IPv6?
  • redmi note 4x(mido) kali nethunter
  • 【2024年数据】67个“绿色金融”主题DID政策汇总(已去重)
  • HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-中断管理
  • cad基础学习
  • 工业制造:分布式控制系统(DCS),一文掌握。
  • mac电脑安装cocoapods出错,以及安装最新版本ruby方法
  • 13 年后,我如何用 Go 编写 HTTP 服务(译)
  • 解决 postman测试接口报404 Not Found
  • 第十五届蓝桥杯全国软件和信息技术专业人才大赛个人赛(软件赛)软件测试组竞赛规则及说明
  • Excel——重复项处理
  • C语言实现一个简易的环形FIFO
  • 跟着GPT学设计模式之原型模式
  • Java图形化界面编程——弹球游戏 笔记
  • jvm体系结构
  • 电力负荷预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型(结合时间序列)
  • Vue源码系列讲解——虚拟DOM篇【一】(Vue中的虚拟DOM)
  • 登录报下面错误The remembered identity will be forgotten and not used for this request
  • 2024.02.11作业
  • FPGA_简单工程_VGA显示驱动器
  • 机器学习系列——(十三)多项式回归
  • openssl3.2 - exp - RAND_bytes_ex
  • 【Linux】信号保存与信号捕捉处理
  • ubuntu20安装mongodb
  • opencv C++ dnn模块调用yolov5以及Intel RealSense D435深度相机联合使用进行目标检测