文档章节

多线程之线程池

kimyeongnam
 kimyeongnam
发布于 2017/04/10 17:34
字数 729
阅读 28
收藏 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
博文 58
码字总数 30975
作品 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
netty学习之Reactor线程模型以及在netty中的应用

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

harries
05/11
0
0
Android中多线程切换的几种方法

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

蓝灰_q
01/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python标准输入输出

input() 读取键盘输入 input() 函数从标准输入读入一行文本,默认的标准输入是键盘。 input 可以接收一个Python表达式作为输入,并将运算结果返回。 print()和format()输出 format()输出...

colinux
17分钟前
0
0
Python 核心编程 (全)

浅拷贝和深拷贝 1.浅拷贝:是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。相当于把变量里面指向的一个地址给了另一个变量就是浅拷贝,而没有创建一个新的对象,如a...

代码打碟手
29分钟前
0
0
PHP 对象比数组省内存?错!数组比对象省内存?错!

刚刚一个群里有人引出了 PHP 数组和对象占用内存谁多谁少的问题。我想起之前我好像也测试过这个问题,和群里人说的对象比数组节省内存的结论相反,我得出的是数组比对象节省内存。 但今天,我...

宇润
45分钟前
1
0
memcached命令行及其用法

21.5 memcached命令行 创建数据 yum install -y telnet 利用telnet命令连接memcached数据库 telnet 127.0.0.1 11211 #写入数据 set key2 0 30 212STORED 这个是错误的示范,因为0 30 已经...

lyy549745
45分钟前
0
0
Maven私服

Maven私服 一、简介 当多人项目开发的时候,尤其聚合项目开发,项目和项目之间需要有依赖关系,通过maven私服,可以保存互相依赖的jar包,这样的话就可把多个项目整合到一起。 如下图: Inst...

星汉
48分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部