多线程的4种方式

简介: 多线程的4种方式

第一种,实现Runnable接口

publicclassMyThreadimplementsRunnable {
@Overridepublicvoidrun() {
System.out.println("hello world");
    }
publicstaticvoidmain(String[] args) {
MyThreadmyThread=newMyThread();
Threadthread=newThread(myThread);
thread.start();
    }
}

第二种,继承Thread类

publicclassMyThread1extendsThread {
@Overridepublicvoidrun() {
System.out.println("hello");
    }
publicstaticvoidmain(String[] args) {
newMyThread1().start();
    }
}

第三种,实现Callable接口

publicclassMyThread2implementsCallable<String> {
@OverridepublicStringcall() throwsException {
System.out.println("call----");
return"call";
    }
publicstaticvoidmain(String[] args) throwsExecutionException, InterruptedException {
FutureTask<String>futureTask=newFutureTask<>(newMyThread2());
newThread(futureTask, "A").start();
System.out.println(futureTask.get());
    }
}

第四种,通过线程池获取线程

开发规范手册中推荐使用的

不要显式创建线程,请使用线程池。

当然

线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。


Executors返回的线程池对象的弊端如下:

1)FixedThreadPool和SingleThreadPool

允许的请求队列长度为Integer.MAX_VALUE(约为21亿),可能对堆积大量的请求,从而导致OOM

2)CacheThreadPool和ScheduledThreadPool

允许创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM

/*** 7个参数* 核心线程池大小* 最大核心线程池大小* 超时了没有人调用就会释放* 超时单位* 阻塞队列* 线程工厂:创建线程的,一般不用动Executors.defaultThreadFactory()* 拒绝策略*/publicThreadPoolExecutor(intcorePoolSize, intmaximumPoolSize, longkeepAliveTime, TimeUnitunit, BlockingQueue<Runnable>workQueue, ThreadFactorythreadFactory, RejectedExecutionHandlerhandle) {
}

四种拒绝策略:

  • new ThreadPoolExecutor.AbortPolicy() // 池满了,还有进来的,不处理,抛出异常
  • new ThreadPoolExecutor.CallerRunsPolicy() // 哪来的去哪里!
  • new ThreadPoolExecutor.DiscardPolicy() //队列满了,丢掉任务,不会抛出异常!
  • new ThreadPoolExecutor.DiscardOldestPolicy() //队列满了,尝试去和最早的竞争,也不会抛出异常!

线程池的最大的大小如何设置?

  1. CPU 密集型,几核,就是几,可以保持CPU的效率最高!
  2. IO 密集型,判断程序中十分耗IO的线程

获取CPU的核数

System.out.println(Runtime.getRuntime().availableProcessors());

目录
相关文章
|
存储 缓存 NoSQL
redis缓存雪崩、穿透、击穿
redis缓存雪崩、穿透、击穿
728 0
|
Java Maven 微服务
搭建springcloud项目——简单明了(一)
本文讲解搭建springcloud项目的方法:操作和eureka-user
7514 1
搭建springcloud项目——简单明了(一)
|
Java 关系型数据库 数据库连接
使用 Spring Boot 执行数据库操作:全面指南
使用 Spring Boot 执行数据库操作:全面指南
1971 1
|
存储 Java 网络架构
Spring Boot中如何实现批量处理
Spring Boot中如何实现批量处理
|
XML JSON API
前后端分离的接口设计规范
前后端分离的接口设计规范
|
前端开发 NoSQL JavaScript
SpringBoot前后端分离项目,打包、部署到服务器详细图文流程
SpringBoot前后端分离项目,打包、部署到服务器详细图文流程
24511 11
|
SQL XML 编解码
手把手教你搭建SpringCloud项目(一)图文详解
手把手教你搭建SpringCloud项目(一)图文详解
7642 1
|
2天前
|
存储 JavaScript 前端开发
JavaScript基础
本节讲解JavaScript基础核心知识:涵盖值类型与引用类型区别、typeof检测类型及局限性、===与==差异及应用场景、内置函数与对象、原型链五规则、属性查找机制、instanceof原理,以及this指向和箭头函数中this的绑定时机。重点突出类型判断、原型继承与this机制,助力深入理解JS面向对象机制。(238字)
|
3天前
|
安全 数据可视化 网络安全
安全无小事|阿里云先知众测,为企业筑牢防线
专为企业打造的漏洞信息收集平台
1303 2
|
4天前
|
云安全 人工智能
2025,阿里云安全的“年度报告”
拥抱AI时代,阿里云安全为你护航~
1451 2