文档章节

多线程之线程池

kimyeongnam
 kimyeongnam
发布于 2017/04/10 17:34
字数 729
阅读 26
收藏 1
点赞 0
评论 3

Java通过Executors提供四种线程池,分别为:newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor

使用线程池首先要有多线程,下面是一个简单的买票系统多线程。

class TicketWidow implements Runnable{
    private int ticketNum = 0;  
    public TicketWidow(){
        this.ticketNum = 5;
    }
    public TicketWidow(int ticketNum) {  
        this.ticketNum = ticketNum;  
    }  
    public int getTicketNum() {  
        return ticketNum;  
    }  
    public void setTicketNum(int ticketNum) {  
        this.ticketNum = ticketNum;  
    }  
    public synchronized void sellOneTicket(String window){  
        if(this.ticketNum > 0){  
            System.out.println(window + "售出一张票,剩余票数: " + --this.ticketNum);  
        }else{  
            System.out.println("车票已售罄!");  
        }  
    }
    @Override
    public void run() {
        while(getTicketNum() > 0){  
            sellOneTicket(Thread.currentThread().getName());  
        }  
    }
}


1.newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。实例如下

public class ThreadTest {
    public static void main(String [] args) {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  
        TicketWidow mWindow = new TicketWidow(5);
        cachedThreadPool.execute(new Thread(mWindow));
        cachedThreadPool.execute(new Thread(mWindow));
    }
}

//执行结果
pool-1-thread-2售出一张票,剩余票数: 4
pool-1-thread-2售出一张票,剩余票数: 3
pool-1-thread-1售出一张票,剩余票数: 2
pool-1-thread-2售出一张票,剩余票数: 1
pool-1-thread-2售出一张票,剩余票数: 0
车票已售罄!


2.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。实例如下

public class ThreadTest {
    public static void main(String [] args) {
        ExecutorService fixedThreadPool  = Executors.newFixedThreadPool(3);  
        TicketWidow mWindow = new TicketWidow(5);
        fixedThreadPool.execute(new Thread(mWindow));
        fixedThreadPool.execute(new Thread(mWindow));
        fixedThreadPool.execute(new Thread(mWindow));
        fixedThreadPool.execute(new Thread(mWindow));
    }
}

//执行结果
pool-1-thread-3售出一张票,剩余票数: 4
pool-1-thread-2售出一张票,剩余票数: 3
pool-1-thread-3售出一张票,剩余票数: 2
pool-1-thread-1售出一张票,剩余票数: 1
pool-1-thread-1售出一张票,剩余票数: 0
车票已售罄!

3.newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

public class ThreadTest {
    public static void main(String [] args) {
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);  
        TicketWidow mWindow = new TicketWidow(5);
        scheduledThreadPool.schedule(new Thread(mWindow), 3, TimeUnit.SECONDS);
        scheduledThreadPool.schedule(new Thread(mWindow), 3, TimeUnit.SECONDS);
        scheduledThreadPool.schedule(new Thread(mWindow), 3, TimeUnit.SECONDS);
    }
}

//执行结果(3秒后输出)
pool-1-thread-1售出一张票,剩余票数: 4
pool-1-thread-2售出一张票,剩余票数: 3
pool-1-thread-2售出一张票,剩余票数: 2
pool-1-thread-2售出一张票,剩余票数: 1
pool-1-thread-2售出一张票,剩余票数: 0
车票已售罄!


4.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

public class ThreadTest {
    public static void main(String [] args) {
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); 
        TicketWidow mWindow = new TicketWidow(10);
        singleThreadExecutor.execute(new Thread(mWindow));
        singleThreadExecutor.execute(new Thread(mWindow));
        singleThreadExecutor.execute(new Thread(mWindow));
    }
}

//执行结果
pool-1-thread-1售出一张票,剩余票数: 4
pool-1-thread-1售出一张票,剩余票数: 3
pool-1-thread-1售出一张票,剩余票数: 2
pool-1-thread-1售出一张票,剩余票数: 1
pool-1-thread-1售出一张票,剩余票数: 0

 

© 著作权归作者所有

共有 人打赏支持
kimyeongnam
粉丝 1
博文 34
码字总数 20480
作品 0
南京
程序员
加载中

评论(3)

千元机爱好者
千元机爱好者

引用来自“千元机爱好者”的评论

代码错了吧 售完票应该减一

引用来自“kimyeongnam”的评论

不是通过-- 操作自减了吗
哦 sorry 没看见那个减减
kimyeongnam
kimyeongnam

引用来自“千元机爱好者”的评论

代码错了吧 售完票应该减一
不是通过-- 操作自减了吗
千元机爱好者
千元机爱好者
代码错了吧 售完票应该减一
Java 多线程系列目录(共43篇)

Java多线程系列目录(共43篇) 最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。 (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 ...

foxeye ⋅ 2016/02/29 ⋅ 0

Java线程:新特征-线程池

Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线...

scau_JD ⋅ 2014/06/13 ⋅ 0

C#多线程学习(四) 多线程的自动管理(线程池)

本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习(五) 多线...

Yamazaki ⋅ 2012/03/29 ⋅ 0

JAVA多线程实现的三种方式

最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结。 1.JAVA多线程实现方式 JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorS...

JasonO ⋅ 2016/03/08 ⋅ 0

JAVA多线程实现和应用总结

最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结。 1.JAVA多线程实现方式 JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorS...

陶诗德 ⋅ 2014/08/21 ⋅ 1

python线程池

什么是线程池? 诸如web服务器、数据库服务器、文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务。构建服务器应用程序的一个过于简单的模型是:每当一个请...

zhengyijie ⋅ 2013/11/21 ⋅ 3

第12篇-JAVA 多线程

第12篇-JAVA 多线程 每篇一句 :不要只看到艰难,要看艰难后面的胜利 初学心得: 敢于尝试,就等于你已经向成功迈出了第一步 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-20| JAVA 多线程 ] ...

JEEP711 ⋅ 2017/08/11 ⋅ 0

netty学习之Reactor线程模型以及在netty中的应用

1.Reactor单线程模型 Reactor单线程模型就是指所有的IO操作都在同一个NIO线程上面完成的,也就是IO处理线程是单线程的。NIO线程的职责是: (1)作为NIO服务端,接收客户端的TCP连接; (2)...

harries ⋅ 05/11 ⋅ 0

Android中多线程切换的几种方法

我们知道,多线程是Android开发中必现的场景,很多原生API和开源项目都有多线程的内容,这里简单总结和探讨一下常见的多线程切换方式。 我们先回顾一下Java多线程的几个基础内容,然后再分析...

蓝灰_q ⋅ 01/01 ⋅ 0

C# WinForm开发系列 - Thread/Delegate/Event

C#是一门支持多线程的语言,因此线程的使用也是比较常见的。由于线程的知识在Win32编程的时候已经说得过多,所以在.Net中很少介绍这部分(可能.Net不觉得这部分是它所特有的)。那我们为什么...

长征2号 ⋅ 2017/10/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java Web如何操作Cookie的添加修改和删除

创建Cookie对象 Cookie cookie = new Cookie("id", "1"); 修改Cookie值 cookie.setValue("2"); 设置Cookie有效期和删除Cookie cookie.setMaxAge(24*60*60); // Cookie有效时间 co......

二营长意大利炮 ⋅ 今天 ⋅ 0

【每天一个JQuery特效】淡入淡出显示或隐藏窗口

我是JQuery新手爱好者,有时间就练练代码,防止手生,争取每天一个JQuery练习,在这个博客记录下学习的笔记。 本特效主要采用fadeIn()和fadeOut()方法显示淡入淡出的显示效果显示或隐藏元...

Rhymo-Wu ⋅ 今天 ⋅ 0

Spring JDBC使用方法

普通实现: 1、创建数据表customer。 可以使用任何数据库实现,在项目中要引入相应数据库驱动包并配置相应数据库连接。 2、创建Customer pojo。 Customer类的属性对应数据库的属性,除了为每...

霍淇滨 ⋅ 今天 ⋅ 0

Contos 7 安装Jenkins

Jenkins是一款能提高效率的软件,它能帮你把软件开发过程形成工作流,典型的工作流包括以下几个步骤 开发 提交 编译 测试 发布 有了Jenkins的帮助,在这5步中,除了第1步,后续的4步都是自动...

欧虞山 ⋅ 今天 ⋅ 0

revel

revel install go get github.com/revel/revelgo get github.com/revel/cmd create new app revel new git.oschina.net/zdglf/myapp run app revel run git.oschina.net/zdglf/myapp ot......

zdglf ⋅ 今天 ⋅ 0

49. Group Anagrams - LeetCode

Question 49. Group Anagrams Solution 思路:维护一个map,key是输入数组中的字符串(根据字符排好序) Java实现: public List<List<String>> groupAnagrams(String[] strs) { Map<Strin......

yysue ⋅ 今天 ⋅ 0

spring Email

使用spring发Email其实就是使用spring自己封装携带的一个javamail.JavaMailSenderImpl类而已。这个类可以当一个普通的java对象来使用,也可以通过把它配置变成spring Bean的方式然后注入使用...

BobwithB ⋅ 今天 ⋅ 0

spark 整理的一些知识

Spark 知识点 请描述spark RDD原理与特征? RDD全称是resilient distributed dataset(具有弹性的分布式数据集)。一个RDD仅仅是一个分布式的元素集合。在Spark中,所有工作都表示为创建新的...

tuoleisi77 ⋅ 今天 ⋅ 0

思考

时间一天天过感觉自己有在成长吗?最怕的是时光匆匆而过,自己没有收获!下面总结下最近自己的思考。 认识自己 认识另一个自己,人们常说要虚心听取别人意见和建议。然而人往往是很难做到的,...

hello_hp ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部