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

    线程池

      是一个容纳多个线程容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源

      目的:节省资源

        通常,线程池都是通过线程池工厂创建,再调用线程池中的方法获取线程,再通过线程去执行任务方法。

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

    使用线程池中线程对象的步骤:

    n  创建线程池对象

    n  创建Runnable接口子类对象

    n  提交Runnable接口子类对象

    n  关闭线程池

    package com.oracle.Demo02;
    
    public class MyRunnable2 implements Runnable{
    		public void run() {
    			for (int i = 0; i <100; i++) {
    				//getName() 得到线程名称
    				System.out.println(Thread.currentThread().getName()+":"+i);
    			}
    		}
    	
    }
    
    package com.oracle.Demo02;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class Demo01 {
    
    	public static void main(String[] args) {
    		//从线程池工厂中创建线程池对象
    		ExecutorService es=Executors.newFixedThreadPool(2);
    		//创建线程任务对象
    		MyRunnable2 mr=new MyRunnable2();
    		//提交线程任务,让线程随机挑选一条想吃执行线程任务
    		es.submit(mr);
    		es.submit(mr);
    		es.submit(mr);
    		//释放资源
    		es.shutdown();
    
    	}
    
    }
    

      

    使用线程池方式—Callable接口

    l  Callable接口:与Runnable接口功能相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果,call方法可抛出异常。

    l  ExecutorService:线程池类

    n  <T> Future<T> submit(Callable<T> task):获取线程池中的某一个线程对象,并执行线程中的call()方法

    l  Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用

    l  使用线程池中线程对象的步骤:

    n  创建线程池对象

    n  创建Callable接口子类对象

    n  提交Callable接口子类对象

    n  关闭线程池

    package com.oracle.Demo02;
    
    import java.util.concurrent.Callable;
    
    public class MyCallble implements Callable<String> {
    
    	@Override
    	public String call() throws Exception {
    		// TODO Auto-generated method stub
    		return "abc";
    	}
    
    }
    
    package com.oracle.Demo02;
    
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Executor;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    
    public class Demo02 {
    
    	public static void main(String[] args) throws InterruptedException, ExecutionException {
    		//从线程池工厂中创建线程池对象
    		ExecutorService ex=Executors.newFixedThreadPool(2);
    		//创建线程任务对象
    		MyCallble mc=new MyCallble();
    		//执行线程任务并获取call方法返回值
    		Future<String> f=ex.submit(mc);
    		//从Future中获取返回值
    		String str=f.get();
    		System.out.println(str);
    		//释放资源
    		ex.shutdown();
    		
    
    	}
    
    }
    

      2个线程,1个线程计算1-100的和,另一个线程计算1-200的和

    package com.oracle.Demo02;
    
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    
    public class Demo04 {
    	public static void main(String[] args) throws InterruptedException, ExecutionException {
    		//2个线程,1个线程计算1-100的和,另一个线程计算1-200的和
    		//创建俩个线程任务
    		GetSum sum1=new GetSum(1,100);
    		GetSum sum2=new GetSum(1,200);
    		//从线程池中创建线程池对象
    		ExecutorService ex=Executors.newFixedThreadPool(2);
    		//执行线程任务并获取call方法返回值
    		Future<Integer> f1=ex.submit(sum1);
    		Future<Integer> f2=ex.submit(sum2);
    		//获取返回值
    		System.out.println(f1.get());
    		System.out.println(f2.get());
    		//关闭线程
    		ex.shutdown();
    	}
    }
    
    package com.oracle.Demo02;
    
    import java.util.concurrent.Callable;
    
    public class GetSum implements Callable<Integer>{
    	private int a;
    	private int b;
    	
    	public int getA() {
    		return a;
    	}
    
    	public void setA(int a) {
    		this.a = a;
    	}
    
    	public int getB() {
    		return b;
    	}
    
    	public void setB(int b) {
    		this.b = b;
    	}
    
    	public GetSum() {
    		super();
    	}
    
    	public GetSum(int a, int b) {
    		super();
    		this.a = a;
    		this.b = b;
    	}
    
    	@Override
    	public Integer call() throws Exception {
    		// TODO Auto-generated method stub
    		int sum=0;
    		for (int i = a; i < b; i++) {
    			sum=sum+i;
    		}
    		return sum;
    	}
    	
    }
    

      

  • 相关阅读:
    linux系列之-—03 压缩和解压缩命令
    Atlassian Confluence安装
    常见ODBC及OLEDB连接串的写法
    windows 怎么验证域名是否开启了 https
    Jenkins基础篇 系列之-—05 集成JIRA
    SVN系列之—-SVN版本回滚的办法
    JMeter 系列之—-02 创建数据库测试计划
    golang web框架 beego 学习 (一) 环境搭建
    补充 3:Golang 一些特性
    补充 1: panic 、recover、 defer
  • 原文地址:https://www.cnblogs.com/zqy6666/p/12312153.html
Copyright © 2011-2022 走看看