package com.www.java3;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 创建线程的方式三——Callable接口------>JDK5.0新增
* 例子:遍历100以内的偶数,并返回他们的和
* @author www
* @creat 2022-{MONTH}-{DAY}
* 1.创建一个实现Callable接口的实现类
* 2.实现call方法,将此线程需要执行的操作声明在call方法中
* 3.创建Callable实现类对象
* 4.将3中的对象作为参数传递到FutureTask构造器中,创建对象
* 5.FutureTask对象作为参数传递到Thread构造器中,创建对象,启动start方法
* 6.如果需要的话,.get()获取返回值
*
* 如何理解Callable接口实现创建多线程比Runnable接口实现功能强大?
* 1.call()有返回值
* 2.call()可以抛出异常,被外面操作捕获,获取异常信息
* 3.Callable支持泛型
*/
public class ThreadNew {
public static void main(String[] args) {
NewThread nt = new NewThread();
FutureTask ft = new FutureTask(nt);
Thread t = new Thread(ft);
t.start();
try {
//get()返回值是FutureTask参数nt返回值(nt是Callable实现类的对象)
Object sum = ft.get();
System.out.println(sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
class NewThread implements Callable{
@Override
public Object call() throws Exception {
int num = 0;
for(int i = 1;i <= 100;i++){
if(i % 2 == 0){
System.out.println(i);
num += i;
}
}
return num;//自动装箱
}
}
package com.www.java3;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 创建线程的方式四:使用线程池
* 1.提供指定线程数量的线程池
* 2.执行指定线程的操作,需要提供Runnable接口或Callable接口实现类的对象
*
* @author www
* @creat 2022-{MONTH}-{DAY}
*/
public class ThreadPool {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(10);//多态形式//接口中都是常量
System.out.println(service.getClass());//service的所属类是ThreadPoolExecutor
//强转
ThreadPoolExecutor service1 = (ThreadPoolExecutor)service; //类中有变量,可以设置
//设置线程池属性
service1.setCorePoolSize(15);
service.execute(new NumberThread());//适用于Runnable
service.execute(new NumberThread1());//适用于Runnable
// service.submit();//适用于Callable
service.shutdown();//关闭线程池
}
}
class NumberThread implements Runnable{
@Override
public void run() {
for(int i = 0; i < 100;i++){
if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ":" +i);
}
}
}
}
class NumberThread1 implements Runnable{
@Override
public void run() {
for(int i = 0; i < 100;i++){
if(i % 2 != 0){
System.out.println(Thread.currentThread().getName() + ":" +i);
}
}
}
}