• java多线程--线程池的使用


           程序启动一个新线程的成本是很高的,因为涉及到要和操作系统进行交互,而使用线程池可以很好的提高性能,尤其是程序中当需要创建大量生存期很短的线程时,应该优先考虑使用线程池.

          线程池的每一个线程执行完毕后,并不会死亡,会再次回到线程池中变成空闲状态,等待下一个对象来调用,类比于数据库连接池.JDK1.5以后,java内置线程池.

         JDK5新增了一个Executors工厂类来产生线程池,通过查文档我们发现,产生线程池很多方法,常用的有以下几个方法:

        •      public static ExecutorService newCachedThreadPool()
        •      public static ExecutorService newFixedThreadPool(int nThreads)
        •      public static ExecutorService newSingleThreadExecutor()

    这些方法的返回值都是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或Callable对象代表的线程,提供了如下方法:

           submit(Runnable task);

           submit(Callable<T> task);

    使用线程池开辟一个新线程的步骤,

    1.创建线程池对象

    2.创建Runnable实例

    3.提交Runable实例

    4.关闭线程池(选择)

    下面通过代码来演示:

    package com.wang.reflect;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    class MyRunnable implements Runnable{
    	@Override
    	public void run() {
    
    		for(int i=0;i<100;i++){
    			System.out.println(Thread.currentThread().getName()+"::"+i);
    		}
    	}
    }
    
    public class ThreadPoolDemo {
    
    	public static void main(String[] args) {
    		//创建线程池对象
    		ExecutorService service = Executors.newFixedThreadPool(2);
    		//执行Runnable对象代表的线程
    		service.submit(new MyRunnable());
    		service.submit(new MyRunnable());
    		//关闭线程池
    		service.shutdown();
    	}
    }
     

    讲到了线程池,就不得不提多线程实现的第三种方法,实现Callable<T>接口,这种方法实现的多线程,就是依赖于线程池而存在的,下面用代码来演示:

    package com.wang.reflect;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    
    class MyCallable implements Callable{
    
        //Callable是一个带泛型的接口,这里先不使用
        @Override
        public Object call() throws Exception {
            for(int i=0;i<100;i++){
                System.out.println(Thread.currentThread().getName()+"::"+i);
            }
            return null;
        }
        
    }
    public class CallableDemo {
    
        public static void main(String[] args) {
            //创建线程池对象
            ExecutorService service = Executors.newFixedThreadPool(2);
            //执行Runnable对象代表的线程
            service.submit(new MyCallable());
            service.submit(new MyCallable());
            //关闭线程池
            service.shutdown();
        }
    }



  • 相关阅读:
    编程自学网站
    SQL中Case语句用法
    SQL 综合应用(1.创建临时表,为后续查询所用) 实例_(学生,课程表,选修表)
    SQL 存储过程(学生,课程表,选修表)
    测试角度看公司流程规范对比后篇
    自动化测试技巧之图片验证
    QTP连载四:神一样的参数化方式?
    自动化测试之控件点击
    自动化测试技巧之结果验证
    自动化测试开展的条件
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5351448.html
Copyright © 2020-2023  润新知