zoukankan      html  css  js  c++  java
  • 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)+"次循环");  
                        }  
                    }  
                });  
            }  
        }  
    }  

      执行结果:

  • 相关阅读:
    页面检测网络外网连接- 网页基础模块(JavaScript)
    sql server替换字段中的某个字符
    关于Linux下 fork() 函数的总结
    郁闷的一天
    关于 Linux 下的线程函数未定义问题
    英文书籍
    学会阅读外文资料
    内存池设计(五)
    内存池设计(四)
    内存池设计(三)
  • 原文地址:https://www.cnblogs.com/lw-20171224/p/13826158.html
Copyright © 2011-2022 走看看