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/


猜你喜欢
- Mybatis的Dao层实现传统开发方式1、编写UserDao接口public interface UserMapper {public L
- 本文实例讲述了Java泛型类与泛型方法的定义。分享给大家供大家参考,具体如下:Java泛型类的定义一 点睛泛型类定义的语法如下:[访问修饰符
- 配置注解的支持:在spring4之后,想要使用注解形式,必须得要引入 aop 的包<dependency><groupId
- 使用TransitionDrawable渐变切换多张图片,供大家参考,具体内容如下1、定义变量private int change = 0;
- 服务限流,是指通过控制请求的速率或次数来达到保护服务的目的,在微服务中,我们通常会将它和熔断、降级搭配在一起使用,来避免瞬时的大量请求对系统
- Google的在Google I/O大会上推出了一款新的开发工具android studio。这是一款基于intellij IDE的开发工具
- 本文实例讲述了C#编程获取客户端计算机硬件及系统信息功能。分享给大家供大家参考,具体如下:这里使用C#获取客户端计算机硬件及系统信息 ,包括
- 在C#中,一共有38个常用的运用符,根据它们所执行运算的特点和它们的优先级,为了便于记忆,我将它们归为七个等级:1、单元运算符和括号。2、常
- 前言说到 ADB 大家应该都不陌生,即 Android Debug Bridge,Android调试桥,身为 Android 开发的我们,熟
- 对于使用文件进行交换数据的应用来说,使用FTP 服务器是一个很不错的解决方案。关于FileZilla Server服务器的详细搭建配置过程,
- Java Double相加出现的怪事问题的提出编译运行下面这个程序会看到什么public class test { public stati
- 一:什么是协变与逆变协变指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,逆变指能够使用比原始指定的派生类型的派生程度更小(不
- 背景现行的文本编辑器大多都具备文本查询的能力,但是并不能直观的告诉用户两段文字的细微差异,所以对比工具在某种情况下,就起到了很便捷的效率。关
- 最近在使用Matrix进行绘图的操作。对Matrix的一些方法有了一些更深的体会,记下来,以便日后复习。Matrix常用的方法:一、变换方法
- java 创建线程Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Threa
- SurfaceView和TextureView均继承于android.view.View与其它View不同的是,两者都能在独立的线程中绘制和
- 目前做项目中有一个需求是这样的,需要通过java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断。try {URL u
- 背景 我们知道在.NET Framework中存在四种常用的定时器,他们分别是:1 两个是通用的多线程定时器:Syste
- 面试题1:Bean 的加载过程是怎样的?我们知道, Spring 的工作流主要包括以下两个环节:解析,读 xml 配置,扫描类文件,从配置或
- Android使用RecyclerView1. 什么是RecyclerViewRecyclerView 是 Android-support-