多线程07-线程池

1. 概念

线程池主要是通过Executors这个类来创建 返回的是ExecutorService对象

2.固定大小线程池

例子:创建固定线程数目为3的线程池

package org.lkl.thead.foo.threadpool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 *
 * Function : 线程池
 * @author : Liaokailin
 * CreateDate : 2014-6-18
 * version : 1.0
 */
public class ExecutorThreadPool {
    public static void main(String[] args) {
        /**
         * 创建固定大小的线程池
         */
        ExecutorService threadPool = Executors.newFixedThreadPool(3) ;
        for(int i=1 ;i<=10 ;i++){
            final int taskid = i ;
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    for(int j=1 ;j<=2 ;j++){
                        try {
                            Thread.sleep(20) ;
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        System.out.println("["+Thread.currentThread().getName()+" ]is loop of  "+j+" for task of "+taskid);

                      }
                }
            }) ;
        }
    }
}

运行结果如下:

[pool-1-thread-1 ]is loop of  1 for task of 1
[pool-1-thread-3 ]is loop of  1 for task of 3
[pool-1-thread-2 ]is loop of  1 for task of 2
[pool-1-thread-2 ]is loop of  2 for task of 2
[pool-1-thread-1 ]is loop of  2 for task of 1
[pool-1-thread-3 ]is loop of  2 for task of 3
[pool-1-thread-2 ]is loop of  1 for task of 4
[pool-1-thread-1 ]is loop of  1 for task of 5
[pool-1-thread-3 ]is loop of  1 for task of 6
[pool-1-thread-2 ]is loop of  2 for task of 4
[pool-1-thread-1 ]is loop of  2 for task of 5
[pool-1-thread-3 ]is loop of  2 for task of 6
[pool-1-thread-1 ]is loop of  1 for task of 7
[pool-1-thread-2 ]is loop of  1 for task of 8
[pool-1-thread-3 ]is loop of  1 for task of 9
[pool-1-thread-1 ]is loop of  2 for task of 7
[pool-1-thread-2 ]is loop of  2 for task of 8
[pool-1-thread-3 ]is loop of  2 for task of 9
[pool-1-thread-1 ]is loop of  1 for task of 10
[pool-1-thread-1 ]is loop of  2 for task of 10

固定的线程池数目为3,那么始终只会有三个线程在运行,只有等到该三个线程的任务完成以后才会去执行其他的任务

3. 缓冲池

ExecutorService threadPool = Executors.newCachedThreadPool() ;

运行结果:

[pool-1-thread-2 ]is loop of  1 for task of 2
[pool-1-thread-1 ]is loop of  1 for task of 1
[pool-1-thread-3 ]is loop of  1 for task of 3
[pool-1-thread-5 ]is loop of  1 for task of 5
[pool-1-thread-4 ]is loop of  1 for task of 4
[pool-1-thread-7 ]is loop of  1 for task of 7
[pool-1-thread-6 ]is loop of  1 for task of 6
[pool-1-thread-10 ]is loop of  1 for task of 10
[pool-1-thread-8 ]is loop of  1 for task of 8
[pool-1-thread-9 ]is loop of  1 for task of 9
[pool-1-thread-1 ]is loop of  2 for task of 1
[pool-1-thread-2 ]is loop of  2 for task of 2
[pool-1-thread-3 ]is loop of  2 for task of 3
[pool-1-thread-5 ]is loop of  2 for task of 5
[pool-1-thread-4 ]is loop of  2 for task of 4
[pool-1-thread-7 ]is loop of  2 for task of 7
[pool-1-thread-6 ]is loop of  2 for task of 6
[pool-1-thread-9 ]is loop of  2 for task of 9
[pool-1-thread-10 ]is loop of  2 for task of 10
[pool-1-thread-8 ]is loop of  2 for task of 8

  缓冲池会按照jvm的调度来分配若干个线程来执行当前需要完成的任务 ,上面的例子有是个线程任务要执行,那么自动分配了10个线程来完成

4.单一的线程池

ExecutorService threadPool = Executors.newSingleThreadExecutor() ;

运行结果:

[pool-1-thread-1 ]is loop of  1 for task of 1
[pool-1-thread-1 ]is loop of  2 for task of 1
[pool-1-thread-1 ]is loop of  1 for task of 2
[pool-1-thread-1 ]is loop of  2 for task of 2
[pool-1-thread-1 ]is loop of  1 for task of 3
[pool-1-thread-1 ]is loop of  2 for task of 3
[pool-1-thread-1 ]is loop of  1 for task of 4
[pool-1-thread-1 ]is loop of  2 for task of 4
[pool-1-thread-1 ]is loop of  1 for task of 5
[pool-1-thread-1 ]is loop of  2 for task of 5
[pool-1-thread-1 ]is loop of  1 for task of 6
[pool-1-thread-1 ]is loop of  2 for task of 6
[pool-1-thread-1 ]is loop of  1 for task of 7
[pool-1-thread-1 ]is loop of  2 for task of 7
[pool-1-thread-1 ]is loop of  1 for task of 8
[pool-1-thread-1 ]is loop of  2 for task of 8
[pool-1-thread-1 ]is loop of  1 for task of 9
[pool-1-thread-1 ]is loop of  2 for task of 9
[pool-1-thread-1 ]is loop of  1 for task of 10
[pool-1-thread-1 ]is loop of  2 for task of 10

    只会有一个线程来执行当前的任务 

5. shutdown 和shutdownNow

ExecutorService对象中有两个方法 一个是shutdown   一个是shutdownNow   看如下代码:

  

package org.lkl.thead.foo.threadpool;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 *
 * Function : 线程池
 * @author : Liaokailin
 * CreateDate : 2014-6-18
 * version : 1.0
 */
public class ExecutorThreadPool {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(3) ;
        for(int i=1 ;i<=10 ;i++){
            final int taskid = i ;
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    for(int j=1 ;j<=2 ;j++){
                        try {
                     //    Thread.sleep(20) ;
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                        System.out.println("["+Thread.currentThread().getName()+" ]is loop of  "+j+" for task of "+taskid);

                      }
                }
            }) ;
        }

        List<Runnable> list = threadPool.shutdownNow() ;

        System.out.println("-----");
        for(Runnable r :list){
            //System.out.println(r.run());
            r.run() ;
        }
        System.out.println("-------------");

    }
}

      执行的结果:

[pool-1-thread-2 ]is loop of  1 for task of 2
[pool-1-thread-1 ]is loop of  1 for task of 1
[pool-1-thread-1 ]is loop of  2 for task of 1
[pool-1-thread-2 ]is loop of  2 for task of 2
-----
[pool-1-thread-3 ]is loop of  1 for task of 3
[pool-1-thread-3 ]is loop of  2 for task of 3
[main ]is loop of  1 for task of 4
[main ]is loop of  2 for task of 4
[main ]is loop of  1 for task of 5
[main ]is loop of  2 for task of 5
[main ]is loop of  1 for task of 6
[main ]is loop of  2 for task of 6
[main ]is loop of  1 for task of 7
[main ]is loop of  2 for task of 7
[main ]is loop of  1 for task of 8
[main ]is loop of  2 for task of 8
[main ]is loop of  1 for task of 9
[main ]is loop of  2 for task of 9
[main ]is loop of  1 for task of 10
[main ]is loop of  2 for task of 10
-------------

threadPool.shutdown() 表示结束当前的线程池  但是在线程池中的任务还会允许继续运行完成,但是不会接收新的任务,方法返回void

threadPool.shutdownNow() 表示立即结束当前的线程池,不管线程池中是否还存在没有完成的任务,返回一个List<Runnable> 表示线程池中没有运行完的任务

6. 通过线程池启动定时器

ScheduledExecutorService scheduledService = Executors.newScheduledThreadPool(3) ;
        //两秒后执行
        scheduledService.schedule(new Runnable() {

            @Override
            public void run() {
                System.out.println("hello");
            }
        }, 2, TimeUnit.SECONDS) ;

        //两秒后执行  以后每隔3秒执行一次
        scheduledService.scheduleAtFixedRate(new Runnable() {

            @Override
            public void run() {
                System.out.println("world");
            }
        }, 2, 3, TimeUnit.SECONDS) ;

多线程07-线程池,布布扣,bubuko.com

时间: 2024-10-12 12:19:28

多线程07-线程池的相关文章

C#多线程之线程池篇3

在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关知识. 五.使用等待句柄和超时 在这一小节中,我们将学习如何在线程池中实现超时和正确地实现等待.具体操作步骤如下: 1.使用Visual Studio 2015创建一个新的控制台应用程序. 2.双击打开"Program.cs"文件,编写代码如下所示: 1 using System; 2 u

多线程及线程池学习心得

一.线程的应用与特点 多线程是程序员不可或缺的技术能力,多线程技术在各个方面都有应用,特别在性能优化上更是起到至关重要的作用.但是,如果多线程写得不好,往往会适得其反,特别是高并发时会造成阻塞.超时等现象.多线程具有以下特点:1.独立性,拥有自己独立的资源,拥有自己私有的地址空间:2.动态性,进程具有自己的生命周期和各种不同的状态:3.并发性,多个进程可以在单个处理器上并发执行,不会相互影响,并行是指同一时刻有多条指令在多个处理器上同时执行.线程是进程的组成部分,一个进程可以拥有多个线程,一个线

C#多线程之线程池篇2

在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我们将学习对于大量的异步操作,使用线程池和分别使用单独的线程在性能上有什么差异性.具体操作步骤如下: 1.使用Visual Studio 2015创建一个新的控制台应用程序. 2.双击打开"Program.cs"文件,编写代码如下所示: 1 using System; 2 using Sys

Java多线程系列 JUC线程池07 线程池原理解析(六)

 关闭“线程池” shutdown()的源码如下: public void shutdown() { final ReentrantLock mainLock = this.mainLock; // 获取锁 mainLock.lock(); try { // 检查终止线程池的“线程”是否有权限. checkShutdownAccess(); // 设置线程池的状态为关闭状态. advanceRunState(SHUTDOWN); // 中断线程池中空闲的线程. interruptIdleWork

C#多线程和线程池

1.概念  1.0 线程的和进程的关系以及优缺点 windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程,CLR(公共语言运行库)为该进程创建了一个线程,该线程称为主线程.例如当我们创建一个C#控制台程序,程序的入口是Main()函数,Main()函数是始于一个主线程的.它的功能主要 是产生新的线程和执行程序.C#是一门支持多线程的编程语言,通过Thread类创建子线程,引入using System.Th

java多线程、线程池的实现

Java实现多线程的3种方法:继承Thread类.实现runnable接口.使用ExecutorService,Callable.Future实现有返回值的多线程.前2种线程的实现方式没有返回值,第三种实现方式可以获取线程执行的返回值. 一:继承java.lang.Thread类 public class MyThread extends Thread { @Override public void run() { System.out.println( "my thread begin.&qu

Linux下简单的多线程编程--线程池的实现

/* 写在前面的话: 今天刚“开原”,选择了一篇关于线程池的文件与大家分享,希望能对您学习有所帮助,也希望能与大家共同学习! 选择在这个特殊的时候注册并发文章也是有一些我个人特殊的意义的,看我的id(西游小学生.45)就知道了,哈哈.在这里也很感谢博客园的员工,刚发申请两分钟就同意了. */ 最近由于要写一个类似于QQ的程序,所以想到要用到多线程.既然要用多线程,那何不写一个线程池?于是上网搜了搜多线程的代码,发现大多都不是很完善,或者有些小bug.所以,在这里贴出一个完整的,经过我多重测试的,

多线程和线程池

有这样一个需求:你有一个list集合,需要使用该集合作为参数,调用另一个系统并返回结果后处理它(主要的目的是处理结果) 解决方案:用线程池,不关闭线程池,将多个线程放入一个List集合中,使用invokeAll方法,相当于是将多个线程打包执行,统一返回,这样线程池可以一直不关闭,不用为了一个list开一个线程池,并且多个线程打包调用不会造成和其他用户的多线程冲突(究竟是你的线程还是我的线程). ExecutorService cachedThreadPool = Executors.newCac

java 多线程和线程池

● 多线程 多线程的概念很好理解就是多条线程同时存在,但要用好多线程确不容易,涉及到多线程间通信,多线程共用一个资源等诸多问题. 使用多线程的优缺点: 优点: 1)适当的提高程序的执行效率(多个线程同时执行). 2)适当的提高了资源利用率(CPU.内存等). 缺点: 1)占用一定的内存空间. 2)线程越多CPU的调度开销越大. 3)程序的复杂度会上升. 对于多线程的示例代码感兴趣的可以自己写Demo啦,去运行体会,下面我主要列出一些多线程的技术点. synchronized 同步块大家都比较熟悉

Android多线程操作——线程池管理综述

题记-- 难过了,悄悄走一走: 伤心了,默默睡一觉: 优雅不是训练出来的,而是一种阅历: 淡然不是伪装出来的,而是一种沉淀: 时间飞逝,老去的只是我们的容颜: 时间仿佛一颗灵魂,越来越动人: 1.简述: 在多线程的世界中,是那么的神奇 与 高效以及合理: 2.创建线程池实例 官方推荐使用Executors类工厂方法来创建线程池管理,Executors类是官方提供的一个工厂类,里面封装了好多功能不一样的线程池,从而使得我们创建线程池非常的简单:                    3.使用线程池