文档章节

多线程之线程池

kimyeongnam
 kimyeongnam
发布于 2017/04/10 17:34
字数 729
阅读 30
收藏 1

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
粉丝 2
博文 55
码字总数 29809
作品 0
南京
程序员
私信 提问
加载中

评论(3)

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

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

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

引用来自“kimyeongnam”的评论

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

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

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

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

foxeye
2016/02/29
106
0
C#多线程学习(四) 多线程的自动管理(线程池)

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

Yamazaki
2012/03/29
0
0
JAVA多线程实现的三种方式

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

JasonO
2016/03/08
126
0
线程池ThreadPoolTaskExecutor配置说明

一般实际开发中经常用到多线程,所以需要使用线程池了,  ThreadPoolTaskExecutor通常通过XML方式配置,或者通过的工厂方法进行配置。  XML方式配置代码如下:交给spring来管理;...

老鼠屎
09/30
0
0
netty学习之Reactor线程模型以及在netty中的应用

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

harries
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

VMware前路难测,多个厂家群雄逐鹿

在人们高谈Salesforce、亚马逊等新兴云计算厂商取得的成就时,以VMware、HPE和Cisco为代表的老牌厂商也在进行着自己的转型和变化,而且还取得一定的进展。以VMware为例,虚拟机巨头公布了第二...

linux-tao
13分钟前
0
0
Palindrome Linked List(leetcode234)

Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2Output: false Example 2: Input: 1->2->2->1Output: true Follow up: Could you do it in O(n) ......

woshixin
15分钟前
0
0
【宇润日常疯测-003】PHP 序列化和 JSON 哪个更好?

有了 Swoole 以后,用我们熟悉的 PHP 就可以很方便地开发网络通信应用。有时候我们系统内部需要交换数据,那么,这时候问题来了,网络通讯的数据格式是选择 JSON 还是 serialize 呢? 一通分...

宇润
16分钟前
1
0
mybatis批量操作sql配置

在写批量sql操作时,遇到执行报错: <foreach collection="list" item="item" index="index" separator=";"> update t_xxx set column1=#{item.column1} where id= #{item.id} </foreach> 分......

lar555
28分钟前
2
0
L2TP VPN客户端配置

打开网络设置-->选择VPN-->添加VPN链接 配置完毕,打开更改适配器选项 右键-->属性 选中安全---允许使用安全协议,确定保存后连接vpn即可

阿伦哥-
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部