• java线程池四种简单案例


    java线程池四种简单案例

    一、固定线程池(固定线程个数

    使用 ExecutorService pool=Executors.newFixedThreadPool(3); 创建一个初始线程为3个的线程池 ,如果超过这个线程个数,后面的线程会等待

      代码:

    package demo;
    
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    /** 
     * 固定线程池 
     * 使用Executors.newFixedThreadPool(3)方法指定池中允许执行线程的个数 
     * 如果超过这个线程个数,后面的线程就会等待 
     */  
    public class FixedThreadPoolTest {  
        public static void main(String[] args) {  
            //创建一个初始线程为3个的线程池  
            ExecutorService pool=Executors.newFixedThreadPool(3);  
            for(int i=0;i<3;i++){  
                final int task=i;  
                pool.execute(new Runnable() {  
                    @Override  
                    public void run() {  
                        try {  
                            Thread.sleep(20);  
                        } catch (InterruptedException e) {  
                            // TODO Auto-generated catch block  
                            e.printStackTrace();  
                        }  
                        for(int j=0;j<3;j++){  
                            System.out.println(Thread.currentThread().getName()+"正在进行第"+(task+1)+"个任务,第"+(j+1)+"次循环");  
                        }  
                    }  
                });  
            }  
            //关闭线程池  
            pool.shutdown();  
        }  
    } 

      执行结果:

     二、缓存线程池(不固定线程个数,池中线程不够,会自动增加线程个数)

    使用  ExecutorService pool=Executors.newCachedThreadPool();  创建一个缓存线程池

      代码:

    package demo;
    
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    /** 
     * 缓存线程池 
     * 如果池中的线程不够,会自动增加线程 
     */  
    public class CachedThreadPoolTest {  
        public static void main(String[] args) {  
            //创建一个缓存线程池  
            ExecutorService pool=Executors.newCachedThreadPool();  
            for(int i=0;i<3;i++){  
                final int task=i;  
                pool.execute(new Runnable() {  
                    @Override  
                    public void run() {  
                        try {  
                            Thread.sleep(20);  
                        } catch (InterruptedException e) {  
                            // TODO Auto-generated catch block  
                            e.printStackTrace();  
                        }  
                        for(int j=0;j<3;j++){  
                            System.out.println(Thread.currentThread().getName()+"正在进行第"+(task+1)+"个任务,第"+(j+1)+"次循环");  
                        }  
                    }  
                });  
            }  
        }  
    }  

      执行结果:

    三、定时器线程池(定时执行线程)

    使用  ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);   创建定时器线程池 

      代码:

    package demo;
    
    import java.util.concurrent.Executors;  
    import java.util.concurrent.ScheduledExecutorService;  
    import java.util.concurrent.TimeUnit;  
    /** 
     * 定时器线程池 
     * 
     */  
    public class ScheduledThreadPoolTest {  
        public static void main(String[] args) {  
          method1();  
    //        method2();  
        }  
          
        /** 
         * 2秒之后执行线程   只执行一次
         */  
        public static void method1(){  
            ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);  
            //2秒之后执行这个线程  
            pool.schedule(new Runnable() {  
                @Override  
                public void run() {  
                    System.out.println("爆炸");  
                }  
            }, 2, TimeUnit.SECONDS);  
        }  
          
        /** 
         * 5秒后第一次执行线程,之后每隔2秒执行一次 
         * 也就是5秒后打印第一次爆炸,之后每隔2秒打印一次爆炸 
         */  
        public static void method2(){  
            ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);  
            pool.scheduleAtFixedRate(new Runnable() {  
                @Override  
                public void run() {  
                    System.out.println("爆炸");  
                }  
            }, 5, 2, TimeUnit.SECONDS);  
        }  
    }  

      method1执行结果:(只执行一次)

      method2执行结果:

    四、单线程池(只有一个线程的线程池)

     使用  ExecutorService pool=Executors.newSingleThreadExecutor();  创建一个单线程池

      代码:

    package demo;
    
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    /** 
     * 只有一个线程工作的线程池 
     * 始终保持池中有一个线程,当一个线程死了会立即重新创建一个线程 
     */  
    public class SingleThreadExecutorTest {  
        public static void main(String[] args) {  
            ExecutorService pool=Executors.newSingleThreadExecutor();  
            for(int i=0;i<3;i++){  
                final int task=i;  
                pool.execute(new Runnable() {  
                    @Override  
                    public void run() {  
                        try {  
                            Thread.sleep(20);  
                        } catch (InterruptedException e) {  
                            // TODO Auto-generated catch block  
                            e.printStackTrace();  
                        }  
                        for(int j=0;j<3;j++){  
                            System.out.println(Thread.currentThread().getName()+"正在进行第"+(task+1)+"个任务,第"+(j+1)+"次循环");  
                        }  
                    }  
                });  
            }  
        }  
    }  

      执行结果:

  • 相关阅读:
    100个精彩的开源游戏
    poj 2104 K-th Number
    Redis源代码分析-内存数据结构intset
    android音乐播放器开发 SweetMusicPlayer 实现思路
    MySQL 二进制日志(Binary Log)
    Node.js 博客实例(六)留言功能
    HBase总结(十二)Java API 与HBase交互实例
    window+Apache 配置虚拟主机(2)
    Web Service那点事
    JSP基本语法
  • 原文地址:https://www.cnblogs.com/lw-20171224/p/13826158.html
Copyright © 2020-2023  润新知