java中多线程与线程池的基本使用方法
作者:Mac编程之道 发布时间:2023-06-23 15:24:09
目录
前言
继承Thread
实现Runnale接口
Callable
线程池
常见的4种线程池。
总结
前言
在java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。为了防止资源不足,服务器应用程序需要采取一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利
用已有对象来进行服务,这就是“池化资源”技术产生的原因。
线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重复使用线程,线程创建的开销就被分摊到了多个任务上了,而且由于在请求到达时线程已经存在,所以消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使用应用程序响应更快。另外,通过适当的调整线程中的线程数目可以防止出现资源不足的情况。
多线程大大提高程序运行效率,我们在开发过程中经常会开启一个线程来执行一些费时的任务。开启一个线程有4种方式,在下面的文章我将详细的去讲解。
继承Thread
继承Thread去执行任务,确实可以开启一个线程去执行任务,如果经常的去开启一些线程,也会导致系统资源的浪费。
public static class Mythread extends Thread{
@Override
public void run() {
System.out.println("当前线程"+Thread.currentThread().getId());
int i = 10/2;
System.out.println("运行结果"+i);
}
}
//调用线程。
public static void main(String[] args) throws ExecutionException, InterruptedException {
/**thread执行方式*/
Mythread mythread = new Mythread();
mythread.start();//启动线程
System.out.println("main--end");
}
实现Runnale接口
public static class MyRunable implements Runnable {
@Override
public void run() {
System.out.println("当前线程"+Thread.currentThread().getId());
int i = 10/2;
System.out.println("运行结果"+i);
}
}
调用。
/**
* runable的启动方式
*/
MyRunable runable = new MyRunable();
new Thread(runable).start();
System.out.println("main--end");
Callable
/**
* Callable可以允许有返回值
*/
public static class Callale01 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("当前线程"+Thread.currentThread().getId());
int i = 10/2;
System.out.println("运行结果"+i);
return i;
}
}
调用。这里需要用callable构建futureTask
/**
* callale的启动方式
*/
FutureTask<Integer> futureTask =new FutureTask<>(new Callale01());
//取返回结果。
Integer i = futureTask.get();
new Thread(futureTask).start();
System.out.println("返回结果是:"+i);
线程池
线程池才是我们java开发中,经常用到一种开启多线程的方式,线程池,自己去管理线程。可以节省系统资源。通常我们会将下面的一些配置写在一些配置类中
/**
* 七大参数
* corePoolSize: 1.核心线程数[一直存在]: 线程池创建好了以后。就准备就绪的线程数量。
* maxinumPoolSize: 2 最大线程数量
* keepaliveTime: 存活时间。空闲线程的最大的等待时间。
* unit 等待时间的单位
* blockingQueue 阻塞队列。如果任务很多就会放在队列里面,只要有线程空闲了,就会去队列里面去取。
* threadFactory :线程的工厂。
* RejectExecutionHandler :如果队列满了。按照我们指定的策略。拒绝执行任务。
*
*/
ThreadPoolExecutor executor = new ThreadPoolExecutor(5,100,10,TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100),
Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
常见的4种线程池。
1 newCachedThreadPool()
创建一个可缓存的线程池,如果线程池长度超过了处理的需要,可灵活的回收空闲线程。若无可回收。则创建新线程。
Executors.newCachedThreadPool();
2.newFixedThreadPool(6)
创建一个固定大小的线程池。
3 newScheduledThreadPool()
定时任务的线程池。
4.newSingleThreadExecutor()
Executors.newSingleThreadExecutor();
来源:https://www.toutiao.com/a7006309828981162527/
猜你喜欢
- 这篇文章主要从以下几个方面来介绍。简单介绍下jersey,springboot,重点介绍如何整合springboot与jersey。什么是j
- Eclipse 最佳字体 推荐:步骤:Eclipse->Windows[窗口]->Preferences[首选项]->Ge
- Eureka 采用 CS(Client/Server,客户端/服务器) 架构,它包括以下两大组件:Eureka Server:Eureka
- 1、修改全局配置文件(application.yml)server: port: 9001 servlet: &nb
- Feign使用@RequestLine遇到的坑如何在微服务项目中调用其它项目的接口试使用spring cloud feign声明式调用。/*
- 前言二进制文件读写两个重要的函数 , fread 和 fwrite , fread 用于读取文件 , fwrite 用于写出文件 ;frea
- 一、垃圾回收机制创建对象就会占据内存,如果程序在执行过程中不能再使用某个对象,这个对象是徒耗内存的垃圾。作为程序员不用关心回收垃圾对象问题,
- springboots使用的版本是2.0.1,注意不同版本可能有差异,并不一定通用添加Mybatis的起步依赖:<!--mybatis
- 本文实例讲述了Android使用shape使组件呈现出特殊效果的方法。分享给大家供大家参考,具体如下:使用到的布局文件<?xml ve
- 使用正则表达式进行替换:代码片段:String documentTxt = EntityUtils.toString(entity,&quo
- 废话不多说,上代码public String getRelativeTimeSpanStringForIphone(long time,lo
- 1.根据单个分隔字符用split截取例如string st="GT123_1";string[] sArray=st.s
- 一、国际化准备资源文件,资源文件的命名格式如下:baseName_language_country.propertiesbaseName_l
- 本文实例讲述了C#基于QRCode实现动态生成自定义二维码图片功能。分享给大家供大家参考,具体如下:二维码早就传遍大江南北了,总以为它是个神
- 本文的目的是要实现左右滑动的指引效果。那么什么是指引效果呢?现在的应用为了有更好的用户体验,一般会在应用开始显示一些指引帮助页面,使用户能更
- 目录一、服务的概念二、Android的多线程编程2.1 线程的基本用法2.2 在子线程中更新UI更新方式一更新方式二2.3 解析异步消息处理
- 一、题目给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值
- springboot整合MySQL很简单,多数据源就master,slave就行了,但是在整合DB2就需要另起一行,以下是同一个yml文件先
- 读取Java文件到byte数组的三种方法(总结)package zs;import java.io.BufferedInputStream;
- 使用的是idea+restful风格第一:引入依赖为:<!--poi--> <dependenc