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

    一、对象池、线程池、常量池、数据库中的池子

    池的概念:

    池是用来约束的,不让程序无节制地创建对象;造成资源浪费

     池的底层是用集合来存储的,对于不经常用的,gc会进行回收


    二、线程池(通过线程池,实现Callable接口)

    为了不无节制地创建对象,使用线程池


    三、使用线程池方式--Runnable接口

    • Executors:线程池创建工厂类
    public static ExecutorService newFixedThreadPool(int nThreads):返回线程池对象
    

    • ExecutorService:线程池类
    Future<?> submit(Runnable task):获取线程池中的某一个线程对象,并执行; **值为null的时候表示线程执行完成**
    	
    Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用
    

    Runnable接口的实现类

    public class MyRunnable implements Runnable {
    
    	@Override
    	public void run() {
    		System.out.println("我要一个教练");
    		
    		try {
    			Thread.sleep(2000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		System.out.println("教练来了: " +Thread.currentThread().getName());
    		System.out.println("教我游泳,交完后,教练回到了游泳池");
    	}
    
    }
    

    测试类

    public class ThreadPoolDemo {
    	public static void main(String[] args) {
    		//创建线程池对象
    		ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象
    		//创建Runnable实例对象
    		MyRunnable r = new MyRunnable();
    		
    		//自己创建线程对象的方式
    		//Thread t = new Thread(r);
    		//t.start(); ---> 调用MyRunnable中的run()
    		
    		//从线程池中获取线程对象,然后调用MyRunnable中的run()
    		service.submit(r);
    		//再获取个线程对象,调用MyRunnable中的run()
    		service.submit(r);
    		service.submit(r);
    		//注意:submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭。将使用完的线程又归还到了线程池中
    
    		//关闭线程池
    		service.shutdown();
    	}
    }
    

    四、使用线程池方式—Callable接口

    • Callable接口:与Runnable接口功能相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果,call方法可抛出异常。
    • ExecutorService:线程池类
    <T> Future<T> submit(Callable<T> task):获取线程池中的某一个线程对象,并执行线程中的call()方法
    Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用
    

    Callable的实现类

    import java.util.concurrent.Callable;
    
    public class MyCallable implements Callable<Object>{
    
    	@Override
    	public Object call() throws Exception {
    		System.out.println("我要一个教练:call");
    		Thread.sleep(2000);
    		System.out.println("教练来了: " +Thread.currentThread().getName());
    		System.out.println("教我游泳,交完后,教练回到了游泳池");
    
    		return null;
    	}
    
    }
    

    测试类

    public class ThreadPoolDemo {
    	public static void main(String[] args) {
    		//创建线程池对象
    		ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象	
    
    		// 创建Callable对象
    		MyCallable c = new MyCallable();
    		service.submit(c);
    		service.submit(c);
    		service.submit(c);
    		//注意:submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭。将使用完的线程又归还到了线程池中
    
    		//关闭线程池
    		service.shutdown();
    	}
    }
    
  • 相关阅读:
    第五次作业
    第四次作业
    第三次作业
    第二次作业
    2013551822第一次作业
    第八次作业
    第七次作业
    第六次作业
    第五次作业
    第四次作业
  • 原文地址:https://www.cnblogs.com/nadou/p/13984174.html
Copyright © 2011-2022 走看看