文档章节

多线程之线程池

kimyeongnam
 kimyeongnam
发布于 2017/04/10 17:34
字数 729
阅读 29
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

ViewPager+Fragment+FragmentPagerAdapter实现软件主界面

ViewPager之前的页面是由View构成的,现在由Fragment构成,之前的PagerAdapter这里也换成了FragmentPagerAdapter.因为PagerAdapter有 public Object instantiateItem(ViewGroup container, i......

鱼想吃肉
18分钟前
0
0
feign文件上传遇到的坑

明天写

王俊博客
23分钟前
0
0
scala的sorted,sortBy,sortWith

val lst = List(1,3,2,4,5) //scala中对于集合的排序有三种方法:sorted,sortBy,sortWith //sorted方法对一个集合进行自然排序,传递一个Ordering隐式参数 def sorted[B >: A](imp...

whoisliang
39分钟前
0
0
区块链扩容最佳途径?十分钟讲清楚侧链技术

今天我们来讲区块链扩容的另一个主流方案——侧链,侧链可作为解决区块链扩容难题的一种有效解决方案。有些人认为,从理论上说,这种解决方案可让所有人都满意。 基础概念 侧链协议本质上是一...

HiBlock
40分钟前
0
0
3年经验Java程序员面阿里P6 差距在哪里

虽然这位小伙伴觉得自己工作三年了,结果阿里连面都不面就把自己挂了,这让自己感到很伤心。但是还是有网友觉得,三年不到p6,很正常啊,明年再面就没有问题啦! Java程序员3年经验面阿里P6,...

架构师springboot
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部