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

    线程池:

      什么是线程池呢?线程池就是线程的容器,线程池就是首先创建一些线程,它们的集合称为线程池。主要用来管理线程的,使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。

    一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。

    什么时候使用线程?

    当程序中要创建大量生存期很短的线程时,应该考虑使用线程池,程序启动一个新线程占用资源大,会过渡消耗系统资源,以及过渡切换线程的危险,从而可能导致系统资源的崩溃。这时,线程池就是最好的选择了。

    代码示例如下:

    package com.ccv.cn;
    ​
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    ​
    public class ThreadDemo05 {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //创建线程池
        ExecutorService espool = Executors.newFixedThreadPool(3);
        //将线程放入池中
        espool.submit(new ThstRunnable());
        Future<Integer> future = espool.submit(new ThstCallable());
        espool.submit(new Runnable() {
            
            @Override
            public void run() {
                // TODO Auto-generated method stub
                for (int i = 0; i <=50; i++) {
                    System.out.println(Thread.currentThread().getName() + "实现Runnable开启线程" + i);
                }
                
            }
        });
        System.out.println("和为:" + future.get());
        //结束线程
        espool.shutdown();
    }
    }
    //创建ThstRunnable类实现Runnable接口
    class ThstRunnable implements Runnable {
        //重写run方法
        @Override
        public void run() {
            for (int i = 0; i < 50; i++) {
                        System.out.println(Thread.currentThread().getName() + "实现Runnable开启线程" + i);
            }
        }
    ​
    }
    //创建ThstCallable类实现Callable接口
    class ThstCallable implements Callable<Integer> {
        //重写run方法
        @Override
        public Integer call() throws Exception {
            int sum = 0;
            for (int i = 1; i <=50; i++) {
                System.out.println(Thread.currentThread().getName() + "实现Callable开启线程" + i);    
                sum += i;
            }
            return sum;
        }
        
    }

    java中的线程构造方法:

    1、newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

    示例代码如下:

    package com.ccv.cn;
    ​
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    public class ThreadDemo09 {
        public static void main(String[] args) {
            //使用newSingleThreadExecutor() 方法创建一个单线程化的线程池
             ExecutorService stp = Executors.newSingleThreadExecutor();
             for (int i = 1; i < 30; i++) {
                 final int a = i;
                stp.execute(new Runnable() {
                //重写run方法
                @Override
                public void run() {
                    try {
                        //依次输出结果
                        System.out.println(Thread.currentThread().getName() + "匿名内部类实现Runnable开启线程" + a);
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
    }

    2、newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

    示例代码如下:

    package com.ccv.cn;
    ​
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    ​
    public class ThreadDemo06 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //使用newCachedThreadPool() 方法创建线程池
        ExecutorService ctp = Executors.newCachedThreadPool();
        for (int i = 0; i <=30; i++) {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            ctp.execute(new Runnable() {
                
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    System.out.println(Thread.currentThread().getName() + "匿名内部类实现Runnable开启线程" );
                    
                }
            });
        }
    ​
    }
    }

    3、newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

    示例代码如下:

    package com.ccv.cn;
    ​
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    ​
    public class ThreadDemo07 {
    public static void main(String[] args) {
        //使用newFixedThreadPool() 方法创建一个可定长线程池
         ExecutorService ftp = Executors.newFixedThreadPool(5);
         for (int i = 0; i < 30; i++) {
            ftp.execute(new Runnable() {
                //重写run方法
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + "匿名内部类实现Runnable开启线程");
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
    }

    4、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

    示例代码如下:

    package com.ccv.cn;
    ​
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    ​
    public class ThreadDemo08 {
    public static void main(String[] args) {
        // 使用newScheduledThreadPool创建一个定长线程池,可延迟执行
        ScheduledExecutorService stp = Executors.newScheduledThreadPool(5);
        
        stp.schedule(new Runnable() {
            
            @Override
            public void run() {
                System.out.println("匿名内部类实现Runnable开启线程:延迟3秒");
            }
            //下面是延迟和被执行时间
        }, 3, TimeUnit.SECONDS);
    }
    }

     

  • 相关阅读:
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Maximum Depth of Binary Tree
    Sharepoint 2013 创建TimeJob 自动发送邮件
    IE8 不能够在Sharepoint平台上在线打开Office文档解决方案
    TFS安装与管理
    局域网通过IP查看对方计算机名,通过计算机名查看对方IP以及查看在线所有电脑IP
    JS 隐藏Sharepoint中List Item View页面的某一个字段
    SharePoint Calculated Column Formulas & Functions
    JS 两个一组数组转二维数组
  • 原文地址:https://www.cnblogs.com/qinchangchuan/p/10852187.html
Copyright © 2011-2022 走看看