纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

java多线程和线程池使用 java中多线程与线程池的基本使用方法

Mac编程之道   2021-09-13 我要评论
想了解java中多线程与线程池的基本使用方法的相关内容吗Mac编程之道在本文为您仔细讲解java多线程和线程池使用的相关知识和一些Code实例欢迎阅读和指正我们先划重点:多线程与线程池的运用,java多线程详解,线程池,java下面大家一起来学习吧

前言

在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();

总结


相关文章

猜您喜欢

  • C++ char*不能修改 C++中char[]能修改char*却不行

    想了解C++中char[]能修改char*却不行的相关内容吗薄荷醇在本文为您仔细讲解C++ char*不能修改的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C++,char*不能修改,C++,char[]能修改char*却不行下面大家一起来学习吧..
  • Java之包和继承 Java语言之包和继承详解

    想了解Java语言之包和继承详解的相关内容吗飞人01_01在本文为您仔细讲解Java之包和继承的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java包,Java继承下面大家一起来学习吧..

网友评论

Copyright 2020 www.sopisoft.net 【绿软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式