java 线程池分类及讲解实例



导读


为什么使用线程

程序只有一个线程,这一个线程就得做所有事情。它必须响应事件、更新程序窗口、执行所有的运算工作。单线程的问题是在特定时刻内,它只能处理一件 事。那么如果我们的某些计算工作需要耗费很长时间,会发生什么?当代码忙于计算需要的值时,程序就停止对用户事件的响应,也不会再对窗口进行更新。如果时 间很长的话,用户可能以为程序卡住了,强行关闭程序。但是,如果你将需要的计算工作放到一个独立的线程中去,你的主线程就有足够的时间去响应用户事件。
注:线程并不是改善程序性能问题的


线程定义

被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。


线程池定义

线程池,一种线程使用模式,线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。功能:应用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。

1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。


线程池分类

1、newCachedThreadPool
作用:创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,并在需要时使用提供的 ThreadFactory 创建新线程,缓存默认60s。

特征:
(1)线程池中数量没有固定,可达到最大值(Interger. MAX_VALUE)
(2)线程池中的线程可进行缓存重复利用和回收(回收默认时间为1分钟)
(3)当线程池中,没有可用线程,会重新创建一个线程

创建方式: Executors.newCachedThreadPool();

2、newFixedThreadPool
作用:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。

特征:
(1)线程池中的线程处于一定的量,可以很好的控制线程的并发量
(2)线程可以重复被使用,在显示关闭之前,都将一直存在
(3)超出一定量的线程被提交时候需在队列中等待

创建方式:
(1)Executors.newFixedThreadPool(int nThreads);//nThreads为线程的数量
(2)Executors.newFixedThreadPool(int nThreads,ThreadFactory threadFactory);//nThreads为线程的数量,threadFactory创建线程的工厂方式

3、newSingleThreadExecutor
作用:创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。

特征:
(1)线程池中最多执行1个线程,之后提交的线程活动将会排在队列中以此执行

创建方式:
(1)Executors.newSingleThreadExecutor() ;
(2)Executors.newSingleThreadExecutor(ThreadFactory threadFactory);// threadFactory创建线程的工厂方式

4、newScheduleThreadPool
作用: 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。

,特征:
(1)线程池中具有指定数量的线程,即便是空线程也将保留
(2)可定时或者延迟执行线程活动

创建方式:
(1)Executors.newScheduledThreadPool(int corePoolSize);// corePoolSize线程的个数
(2)newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory);// corePoolSize线程的个数,threadFactory创建线程的工厂

5、newSingleThreadScheduledExecutor
作用: 创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。

特征:
(1)线程池中最多执行1个线程,之后提交的线程活动将会排在队列中以此执行
(2)可定时或者延迟执行线程活动

创建方式:
(1)Executors.newSingleThreadScheduledExecutor() ;
(2)Executors.newSingleThreadScheduledExecutor(ThreadFactory threadFactory) ;//threadFactory创建线程的工厂


线程池实例


Thread 类

public class Thread implements Runnable {

    @Override
    public void run() {
        System.out.println("thread start");
    }
}


newCachedThreadPool 实例

public class ThreadPool {

    public static void main(String[] args) { 
        ExecutorService fixedThreadPool = Executors.newCachedThreadPool();
        Thread thread = new Thread();
        fixedThreadPool.submit(thread);
        fixedThreadPool.shutdown();
    }
}

newSingleThreadExecutor 实例

public class ThreadPool {

    public static void main(String[] args) { 
        ExecutorService fixedThreadPool = Executors.newSingleThreadExecutor();
        Thread thread = new Thread();
        fixedThreadPool.submit(thread);
        fixedThreadPool.shutdown();
    }
}


newFixedThreadPool 实例

public class ThreadPool {

    public static void main(String[] args) { 
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
        Thread thread = new Thread();
        fixedThreadPool.submit(thread);
        fixedThreadPool.shutdown();
    }
}


newScheduleThreadPool 实例

public class ThreadPool {

    public static void main(String[] args) { 
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
        Thread thread = new Thread();
        scheduledExecutorService.submit(thread);
        scheduledExecutorService.shutdown();
    }
}


newSingleThreadScheduledExecutor 实例

public class ThreadPool {

    private static final ScheduledExecutorService excutor = Executors.newSingleThreadScheduledExecutor();

    public static void main(String[] args) {
        Thread thread = new Thread();
        excutor.scheduleWithFixedDelay(thread, 0, 1, TimeUnit.SECONDS);
        excutor.scheduleWithFixedDelay(thread, 0, 2, TimeUnit.SECONDS);
        excutor.scheduleWithFixedDelay(thread, 0, 3, TimeUnit.SECONDS);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值