zoukankan      html  css  js  c++  java
  • java多线程之线程池

     数据库连接池类似,线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable对象或Callable对象传给线程池,线程池就会启动一个线程来执行它们的run()或call()方法,当执行完毕后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。

    • Executors工厂类:该工厂类包含多个静态工厂方法来创建线程池。 
      ① newCachedThreadPool():创建一个具有缓存功能的线程池,系统根据需要创建线程,这些线程将会被缓存在线程池中。 
      ② newFixedThreadPool(int nThreads):创建一个可重用的、具有固定线程数的线程池 
      ③ newScheduledThreadPool(int corePoolSize):创建具有指定线程数的线程池,它可以在指定延迟后执行线程任务。 
      ④ newWorkStealingPool(int parallelism):创建持有足够的线程的线程池来支持给定的并行级别,该方法还会使用多个队列来减少竞争。
    • ExecutorService类:代表尽执行线程的线程池,即只要线程池中有空闲线程,就立即执行线程任务
    • ScheduledExecutorService类:代表可在指定延迟后或周期性地执行线程任务的线程池。

    使用线程池来执行线程任务的步骤如下:

      1. 调用Executors类的静态工厂方法创建一个ExecutorService对象,该对象代表一个线程池
      2. 创建Runnable实现类或Callable实现类的实例,作为线程执行任务
      3. 调用ExecutorService对象的submit()方法来提交Runnable实例或Callable实例
      4. 当不想提交任何任务时,调用ExecutorService对象的shutdown()方法来关闭线程

    例子:

    package com.ming.thread.six.threadpool;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * 创建一个具有缓存功能的线程池,系统根据需要创建线程,这些线程将会被缓存在线程池中。
     * @author ming
     *
     */
    public class CachedThreadPoolTest {
    
        public static void main(String[] args) {
            ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
            for (int i = 0; i < 10; i++) {
                final int index = i;
                try {
                    Thread.sleep(index * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                cachedThreadPool.execute(new Runnable() {
                    public void run() {
                        System.out.println(index);
                    }
                });
            }
        }
    }
    package com.ming.thread.six.threadpool;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    
    /**
     * 创建一个可重用的、具有固定线程数的线程池 
     * @author ming
     *
     */
    public class FixedThreadPoolTest {
    
        public static void main(String[] args) {
            ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
            for (int i = 0; i < 10; i++) {
                final int index = i;
                fixedThreadPool.execute(new Runnable() {
                    public void run() {
                        try {
                            System.out.println(index);
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        }
    }
    package com.ming.thread.six.threadpool;
    
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    /**
     * 线程迟中定时执行/创建具有指定线程数的线程池,它可以在指定延迟后执行线程任务。 
     * @author ming
     *
     */
    public class ScheduledThreadPoolTest {
    
        public static void main(String[] args) {
            ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
            scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
                public void run() {
                    System.out.println("delay 3 seconds");
                }
            }, 1, 3, TimeUnit.SECONDS);//表示延迟1秒后每3秒执行一次。
        }
    
    }
    package com.ming.thread.six.threadpool;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * 创建持有足够的线程的线程池来支持给定的并行级别,该方法还会使用多个队列来减少竞争。
     * @author ming
     *
     */
    public class SingleThreadExecutorTest {
    
        public static void main(String[] args) {
            ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
            for (int i = 0; i < 10; i++) {
                final int index = i;
                singleThreadExecutor.execute(new Runnable() {
                    public void run() {
                        try {
                            System.out.println(index);
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        }
    }
  • 相关阅读:
    spring-boot、spring-data-jpa整合
    Executors中的几种线程调用方式
    通过BeanFactoryPostProcessor来获取bean
    spring、spring-data-redis整合使用
    java.io几种读写文件的方式
    springmvc+quartz简单实现定时调度
    httpclient跳过https请求的验证
    Gson的几种使用方式
    httpclient的几种请求URL的方式
    【转】文件各种上传,离不开的表单
  • 原文地址:https://www.cnblogs.com/huzi007/p/7093391.html
Copyright © 2011-2022 走看看