线程池

线程池

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

  目的:节省资源

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

使用线程池方式--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;
	}
	
}

  

原文地址:https://www.cnblogs.com/zqy6666/p/12312153.html