Java基础:多线程之线程池

1.线程池的概念与Executors类的应用
    应用需求:如果访问服务器的客户端很多,那么服务器要不断的创建和销毁线程,这将严重的影响服务器的性能
    解决方法:首先创建一些线程,它们的集合称为线程池,当服务器接受到一个客户请求后,就从线程池中取出一个空闲的线程为之服务,服务完后不关闭该线程,而是将线程还回到线程池中。
    创建固定大小的线程池;
    创建缓存线程池;
    创建单一线程池(可以实现线程死掉后重新启动,即如果线程死掉,会自动重现创建一个替补线程来接替运行任务);
    注意:在线程池的编程模式下,任务是提交给整个线程池的,而不是直接交给某个线程;线程池在拿到任务后,它就在内部找有无空闲的线程,再把任务交给某个空闲的线程,这就是封装。记住,任务是提交给整个线程池的,一个线程同时只能执行一个任务,但可同时向一个线程池提交多个任务。

2.关闭线程池
     shutdown与shutdownNow的比较:
     shutdown: 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。
     shutdownNow: 试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。

3.用线程池启动定时器
     ScheduledExecutorService newScheduledThreadPool(int corePoolSize):
     创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。

演示代码如下:

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

public class ThreadPool {

    public static void main(String[] args){
        threadPoolTest();
        //scheduledThreadPoolTest();
    }

    private static void threadPoolTest() {
        //1.创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程
        //ExecutorService threadPool=Executors.newFixedThreadPool(3);

        //2.创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们
        //ExecutorService threadPool=Executors.newCachedThreadPool();

        //3.创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程
        ExecutorService threadPool=Executors.newSingleThreadExecutor();
        for(int i=1;i<=10;i++){
            final int taskNum=i;
            threadPool.execute(new Runnable(){//十个任务,但始终只有三个线程
                public void run(){
                    System.out.println(Thread.currentThread().getName()+" is running ..... for task "+taskNum);
                }
            });
        }

        //没有新的任务到来,线程就会等待,线程不死,程序就不会结束,除非显示shutdown
        threadPool.shutdown();
        // 试图停止所有正在执行的活动任务,暂停处理正在等待的任务,即立即关闭
        //threadPool.shutdownNow();
    }

    private static void scheduledThreadPoolTest() {
        Runnable r=new Runnable(){
            @Override
            public void run() {
                System.out.println("bombing......");
            }
        };
        //10秒后执行
        //ScheduledFuture<?> sf=Executors.newScheduledThreadPool(3).schedule(r, 10, TimeUnit.SECONDS);
        //4秒后开始执行,每2秒执行一次
        Executors.newScheduledThreadPool(3).scheduleAtFixedRate(r, 4, 2, TimeUnit.SECONDS);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值