zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【 java 多线程】创建多线程的方式四:使用线程池创建多线程

JAVA多线程线程 创建 方式 使用
2023-09-27 14:26:52 时间

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
  • 📝 个人主页:馆主阿牛🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:java 小白到高手的蜕变🍁
  • 💬格言:要成为光,因为有怕黑的人!🔥
    请添加图片描述

前言

今天我们来大概写一写最后一种创建多线程的方式,也是我们开发中最常用的方式,对于线程池这一块知识点很多,本博客大概写一写线程池的使用,暂时不会深入!

使用线程池的好处

1.背景:经常创建和销毁、使用最特别大的资源,比如并发情况下的线程,
对性能影响很大。
2.思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毀、实现重复利用。类似生活中的公共交通工具。

3.好处:

  • 提高响应速度(减少了创建新线程的时间)
  • 降低资源消耗(重复利用线程池中线程,不需要每次都创建)
  • 便于线程管理
    • corePoolSize:核心池的大小
    • maxmumPoolSize:最大线程数
    • keepAliveTime:线程没有任务时最多保持多长时间会终止

线程池相关API

  • JDK 5.0起提供了线程池相关 APl : ExecutorService 和 Executors

  • ExecutorService :真正的线程池接口。常见子类 ThreadPoolExecutor。

    • void execute ( Runnable command ):执行任务/命令,没有返回值,一般用来执行Runnable
    • Future submit(Callable task):执行任务,有返回值,一般用来执行Callable
    • void shutdown ():关闭连接池
  • Executors :工具类、线程池的工厂类,用于创建并返回不同类型的线程池。

    • Executors.newCachedThreadPool ():创建一个可根据需要创建新线程的线程池
    • Executors.newFixedThreadPool (n);创建一个可重用固定线程数的线程池
    • Executors.newSingleThreadExecutor ():创建一个只有一个线程的线程池
    • Executors.newScheduledThreadPool (n):创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。

线程池的使用步骤及案例

package 多线程;

import java.util.concurrent.*;

public class ThreadPool {
    public static void main(String[] args){
        // 1.提供指定线程数量的线程池
        ExecutorService service = Executors.newFixedThreadPool(10);

        // 2.执行指定的线程的操作,需要提供Runnable接口或者Callable接口实现类的对象

        service.execute(new MyRun()); //execute适用于Runnable

        Future f = service.submit(new MyCall()); //submit是用于Callable

        try {
           Integer sum =  (Integer)f.get(); // 获取call()的返回值
           System.out.println(Thread.currentThread().getName() + ":" + sum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        // 3.关闭连接池
        service.shutdown();
    }
}

// 实现Runnable接口
class MyRun implements Runnable{
    @Override
    public void run() {
        for (int i=1;i<=10;i++){
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
}

// 实现Callable接口
class MyCall implements Callable {
    @Override
    public Object call() throws Exception {
        int sum = 0;
        for (int i=1;i<=10;i++){
            sum += i;
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
        return sum;
    }
}

在这里插入图片描述

结语

如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。

🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门