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

目录
  • 前言
  • 继承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();

总结

到此这篇关于java中多线程与线程池基本使用的文章就介绍到这了,更多相关java多线程和线程池使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java多线程学习笔记之自定义线程池

    当我们使用 线程池的时候,可以使用 newCachedThreadPool()或者 newFixedThreadPool(int)等方法,其实我们深入到这些方法里面,就可以看到它们的是实现方式是这样的. public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueu

  • java简单实现多线程及线程池实例详解

    本文为大家分享了java多线程的简单实现及线程池实例,供大家参考,具体内容如下 一.多线程的两种实现方式 1.继承Thread类的多线程 /** * 继承Thread类的多线程简单实现 */ public class extThread extends Thread { public void run(){ for(int i=0;i<100;i++){ System.out.println(getName()+"-"+i); } } public static void mai

  • Java多线程之线程池七个参数详解

    ThreadPoolExecutor是JDK中的线程池实现,这个类实现了一个线程池需要的各个方法,它提供了任务提交.线程管理.监控等方法. 下面是ThreadPoolExecutor类的构造方法源码,其他创建线程池的方法最终都会导向这个构造方法,共有7个参数:corePoolSize.maximumPoolSize.keepAliveTime.unit.workQueue.threadFactory.handler. public ThreadPoolExecutor(int corePoolS

  • java多线程教程之如何使用线程池详解

    为什么要用线程池? 诸如 Web 服务器.数据库服务器.文件服务器或邮件服务器之类的许多服务器应用程序都面临处理来自某些远程来源的大量短小的任务.请求以某种方式到达服务器,这种方式可能是通过网络协议(例如 HTTP.FTP 或 POP).通过 JMS 队列或者可能通过轮询数据库.不管请求如何到达,服务器应用程序中经常出现的情况是:单个任务处理的时间很短而请求的数目却是巨大的. 只有当任务都是同类型并且相互独立时,线程池的性能才能达到最佳.如果将运行时间较长的与运行时间较短的任务混合在一起,那么除

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

    目录 前言 继承Thread 实现Runnale接口 Callable 线程池 常见的4种线程池. 总结 前言 在java中,如果每个请求到达就创建一个新线程,开销是相当大的.在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多.除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源.如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或"切换过度"而导致系统资源不足.为了防止资源不足,服务器应用程

  • Java中四种线程池的使用示例详解

    在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及"过度切换". 本文详细的给大家介绍了关于Java中四种线程池的使用,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: FixedThreadPool 由Executors的newFixedThreadPool方法创建.它是一种线程数量固定的线程

  • Java中如何判断线程池任务已执行完成

    目录 不判断的问题 方法1:isTerminated 缺点分析 扩展:线程池的所有状态 方法2:getCompletedTaskCount 方法说明 优缺点分析 方法3:CountDownLatch 优缺点分析 方法4:CyclicBarrier 方法说明 优缺点分析 总结 前言: 很多场景下,我们需要等待线程池的所有任务都执行完,然后再进行下一步操作.对于线程 Thread 来说,很好实现,加一个 join 方法就解决了,然而对于线程池的判断就比较麻烦了. 我们本文提供 4 种判断线程池任务是

  • java中通用的线程池实例代码

    复制代码 代码如下: package com.smart.frame.task.autoTask; import java.util.Collection;import java.util.Vector; /** * 任务分发器 */public class TaskManage extends Thread{    protected Vector<Runnable> tasks = new Vector<Runnable>();    protected boolean run

  • Java线程池的简单使用方法实例教程

    目录 线程池使用场景? Java线程池使用 总结 线程池使用场景? java中经常需要用到多线程来处理一些业务,我们非常不建议单纯使用继承Thread或者实现Runnable接口的方式来创建线程,那样势必有创建及销毁线程耗费资源.线程上下文切换问题.同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理.java中涉及到线程池的相关类均在jdk1.5开始的java.util.concurrent包中,涉及到的几个核心类及接口包括:Executor.Execut

  • 一文彻底搞懂java多线程和线程池

    目录 什么是线程 一. Java实现线程的三种方式 1.1.继承Thread类 1.2.实现Runnable接口,并覆写run方法 二. Callable接口 2.1 Callable接口 2.2 Future接口 2.3 Future实现类是FutureTask. 三. Java线程池 3.1.背景 3.2.作用 3.3.应用范围 四. Java 线程池框架Executor 4.1.类图: 4.2 核心类ThreadPoolExecutor: 4.3 ThreadPoolExecutor逻辑结

  • Java多线程与线程池技术分享

    目录 一.序言 1.普通执行 2.线程池执行 二.线程池基础 1.核心参数 2.参数与池的关系 1.通用对比 2.拓展对比 3.无返回值任务 4.有返回值任务 三.Executors 1.创建单一线程的线程池 2.创建固定数量的线程池 3.创建可伸缩的线程池 4.创建定时调度的线程池 四.手动创建线程池 五.其它 1.配置线程池的参数 2.线程池监控 六.总结 一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作

  • Java多线程 自定义线程池详情

    主要介绍: 1.任务队列 2.拒绝策略(抛出异常.直接丢弃.阻塞.临时队列) 3.init( min ) 4.active 5.max min<=active<=max package chapter13; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class SimpleThreadPool { public final static DiscardPolicy

随机推荐