Java中线程池创建与使用

线程池是Java5以后添加的内容,使用Executors工具类可以创建4种线程池

一、线程数量固定的线程池

public class ThreadPoolTest
{
    public static void main(String[] args)
    {
        /*
         * 创建固定的线程池
         * 1、线程池中始终存在3条线程
         */
        ExecutorService threadPool = Executors.newFixedThreadPool(3);
        //共有10个任务需要执行
        for(int i = 0; i < 10; i++)
        {
            final int task = i;
            threadPool.execute(new Runnable()
            {
                @Override
                public void run()
                {
                    for(int i = 0; i < 10; i++)
                    {
                        try
                        {
                            Thread.sleep(30);
                        }
                        catch (Exception e)
                        {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        /*
                         * 根据控制台的输出结果可以知道,不管有多少任务需要执行,
                         * 线程池都是使用已经存在的3条线程,完成当前的任务后,再去执行在线程池中等待的其他任务
                         */
                        System.out.println(Thread.currentThread().getName() 
                                + "-time:" + i + "#task:" + task);
                    }
                }
            });
        }
        
        /*
         * 任务完成后 别忘了关闭线程池。。。
         * 等待提交的任务完成后,关闭线程池
         */
        threadPool.shutdown();
        
        /*
         * 根据JDK文档描述,线程池会调用Thread.interrupt()来实现中断线程,
         * 但是interrupt()作用有限,如果线程没有处于sleep 、wait等状态的,
         * 则无法终止当前线程。
         * 所以shutdownNow()不代表线程池立即能关闭
         * 
         */
        //threadPool.shutdownNow();
    }
}


二、线程数量不定的缓存线程池


public class ThreadPoolTest
{
    public static void main(String[] args)
    {
        /*
         * 创建缓存线程池
         * 1、线程池中的线程数不一定
         * 根据JDK文档的描述  线程池会根据需要创建新的线程,
         * 但是也会重用以前创建的处于空闲状态的线程,如果一个
         * 线程60秒没有被使用,将会被终止 并被从缓存区移除
         */
        ExecutorService threadPool = Executors.newCachedThreadPool();
        //共有10个任务需要执行
        for(int i = 0; i < 10; i++)
        {
            final int task = i;
            threadPool.execute(new Runnable()
            {
                @Override
                public void run()
                {
                    for(int i = 0; i < 10; i++)
                    {
                        try
                        {
                            Thread.sleep(30);
                        }
                        catch (Exception e)
                        {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        
                        /*
                         * 根据控制台的输出结果可以知道,确实是根据需要创建了10条线程
                         */
                        System.out.println(Thread.currentThread().getName() 
                                + "-time:" + i + "#task:" + task);
                    }
                }
            });
        }
        
        /*
         * 任务完成后 别忘了关闭线程池。。。
         * 等待提交的任务完成后,关闭线程池
         */
        threadPool.shutdown();
        
        /*
         * 根据JDK文档描述,线程池会调用Thread.interrupt()来实现中断线程,
         * 但是interrupt()作用有限,如果线程没有处于sleep 、wait等状态的,
         * 则无法终止当前线程。
         * 所以shutdownNow()不代表线程池立即能关闭
         * 
         */
        //threadPool.shutdownNow();
    }
}


三、创建只有一条线程的单一线程池
public class ThreadPoolTest
{
    public static void main(String[] args)
    {
        /*
         * 创建单一线程的线程池
         * 1、线程池中的线程数只有一条
         * 根据JDK文档的描述  线程池一直存在一条单一的
         * 线程用来执行任务,如果这条线程结束后,
         * 会根据需要重新创建一条新的线程来执行任务
         */
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
        //共有10个任务需要执行
        for(int i = 0; i < 10; i++)
        {
            final int task = i;
            threadPool.execute(new Runnable()
            {
                @Override
                public void run()
                {
                    for(int i = 0; i < 10; i++)
                    {
                        try
                        {
                            Thread.sleep(30);
                        }
                        catch (Exception e)
                        {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        
                        /*
                         * 根据控制台的输出结果可以知道,线程池中始终只有一条线程
                         */
                        System.out.println(Thread.currentThread().getName() 
                                + "-time:" + i + "#task:" + task);
                    }
                }
            });
        }
        
        /*
         * 任务完成后 别忘了关闭线程池。。。
         * 等待提交的任务完成后,关闭线程池
         */
        threadPool.shutdown();
        
        /*
         * 根据JDK文档描述,线程池会调用Thread.interrupt()来实现中断线程,
         * 但是interrupt()作用有限,如果线程没有处于sleep 、wait等状态的,
         * 则无法终止当前线程。
         * 所以shutdownNow()不代表线程池立即能关闭
         * 
         */
        //threadPool.shutdownNow();
    }
}


四、创建调度任务的线程池

public class ThreadPoolTest
{
    public static void main(String[] args)
    {
        /*
         * 创建调度任务的线程池  确定了延迟时间后执行
         */
        Executors.newScheduledThreadPool(1).schedule(new Runnable()
        {
            
            @Override
            public void run()
            {
                System.out.println("boom!");
                
            }
        }, 2, TimeUnit.SECONDS);
        
        
        /*
         * 创建调度任务的线程池  含固定频率
         */
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable()
        {
            
            @Override
            public void run()
            {
                System.out.println("boom-2!");
                
            }
        }, 2, 1, TimeUnit.SECONDS);

    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值