Java多线程2.8.线程池2-ExecutorService对象-Callable接口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cmm0401/article/details/82716760

线程池

1、实现Callable接口来实现线程池

  • Callable:是带泛型的接口。
  • 这里指定的泛型其实是call()方法的返回值类型。

(1)创建实现Callable类的线程类

package cn.itcast_09;
import java.util.concurrent.Callable;

//Callable:是带泛型的接口。
//这里指定的泛型其实是call()方法的返回值类型。
public class MyCallable implements Callable {
	@Override
	public Object call() throws Exception {
		for (int x = 0; x < 100; x++) {
			System.out.println(Thread.currentThread().getName() + ":" + x);
		}
		return null;
	}

}

(2)测试线程类

package cn.itcast_09;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CallableDemo {
	public static void main(String[] args) {
		//创建线程池对象
		ExecutorService pool = Executors.newFixedThreadPool(2);
		
		//可以执行Runnable对象或者Callable对象代表的线程
		pool.submit(new MyCallable());
		pool.submit(new MyCallable());
		
		//结束
		pool.shutdown();
	}
}

2、 多线程实现的方式3

  • 方式1:继承Thread类
  • 方式2:实现Runnable接口
  • 方式3:实现Callable接口

/*
 * 多线程实现的方式3:
 *      A:创建一个线程池对象,控制要创建几个线程对象。
 *             public static ExecutorService newFixedThreadPool(int nThreads)
 *         B:这种线程池的线程可以执行
 *             可以执行Runnable对象或者Callable对象代表的线程
 *             做一个类实现Runnable接口。做一个类实现Callable接口。
 *         C:调用如下方法即可:
 *             Future<?> submit(Runnable task)
 *            <T> Future<T> submit(Callable<T> task)
 *        D:我就要结束,可以吗?
 *            可以。pool.shutdown();
 */

3、实现Callable接口来实现线程池的案例:求和

(1)创建线程类

package cn.itcast_10;
import java.util.concurrent.Callable;
/*
 * 线程求和案例
 */
public class MyCallable implements Callable<Integer> {
	private int number;
	public MyCallable(int number) {
		this.number = number;
	}
	@Override
	public Integer call() throws Exception {
		int sum = 0;
		for (int x = 1; x <= number; x++) {
			sum += x;
		}
		return sum;
	}

}

(2)创建线程池对象,并测试

package cn.itcast_10;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableDemo {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		// 创建线程池对象
		ExecutorService pool = Executors.newFixedThreadPool(2);
		// 可以执行Runnable对象或者Callable对象代表的线程
		Future<Integer> f1 = pool.submit(new MyCallable(100));
		Future<Integer> f2 = pool.submit(new MyCallable(200));
		// V get()
		Integer i1 = f1.get();
		Integer i2 = f2.get();
		System.out.println(i1);
		System.out.println(i2);
		// 结束
		pool.shutdown();
	}
}

猜你喜欢

转载自blog.csdn.net/cmm0401/article/details/82716760