zoukankan      html  css  js  c++  java
  • 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();
        }
    }



  • 相关阅读:
    hdu4587 Two Nodes 求图中删除两个结点剩余的连通分量的数量
    洛谷3388 tarjan割点
    POJ1523 Tarjan求割点以及删除割点之后强连通分量的数量
    POJ1144 tarjan+网络中割点与割边的数量
    POJ1780 欧拉路+手写栈解决爆战问题
    Delphi 窗体函数GetForegroundWindow
    Delphi 窗体函数GetClassName
    Delphi 窗体函数GetDesktopWindow
    Delphi 窗体函数 GetTopWindow、GetNextWindow
    Delphi 调用惯例 register, pascal, cdecl, stdcall, safecall 介绍
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5351448.html
Copyright © 2011-2022 走看看