新增方式一: 实现callable接口。Callable是Runnable的子接口,其实在创建新线程的时候,用的还是Thread(Runnable target)构造器。只不过与实现Runnable接口相比,callable功能更强一些
相比run()方法,可以有返回值
方法可以抛出异常
支持泛型的返回值,返回值为泛型指定的类型。
需要借助FutureTask类,比如获取返回结果
FutureTask 是Futrue接口的唯一的实现类,FutrueTask同时实现了Runnable和Future接口,它既可以作为Runnable重写run方法被线程执行,又可以作为Futrue调用get方法得到Callable的返回值。
//1.0创建一个实现Callable接口的类
class NumThread implements Callable{
public Object call ()Throws Exception{ //2.0重写call方法
int sum =0;
for(int i = 0; i<=100;i++){
System.out.println(i);
sum = sum+i;
}
return sum;
}
}
public class ThreadNew{
public static void main (String[] args ) throws Exception{
NumThread numThread = new NumThread (); //3.0创建Callable实现类的对象
FutureTask futureTask = new FutureTask(numThread); // 4.0将此Callable接口实现类的对象作为参数传递到FutureTask的构造器中,创建Futrue对象
new Thread (futureTask).start(); //5.0将FutureTask的对象作为参数传递到Thread类的构造器。启动线程。
Object sum = futureTask.get(); //6.0获取返回值
}
}
新增方式2:
jdk 5.0起提供了线程池相关API ExecutorService 和 Executors
ExecutorService:真正的线程池接口。常见的子类ThreadPoolExecutor
其方法:void execute(Runnable command):执行命令/任务,没有返回值,一般用来执行Runnable
Futuresubmit(Callable task):执行任务,有返回值,一般用来执行Callable
void shoutdown():关闭连接池
Executors:工具类、线程池的工具类,用于创建并返回不同类型的线程池。
1.0 提供指定线程数量的线程池
2.0执行指定的线程操作,需要提供实现Runnable接口或Callable接口的类的对象
3.0关闭连接池
public class ThreadPool{
public static void main (){
ExecutorService service = Executors.newFixedThreadPool(10);
service.execute(new NumThread()); //适用于Runnable
//service.submit(Callable callable ); //适用于callable
ervice.submit(new NumThread1());
service.shutdown();
}
}
class NumThread implements Runnable {
void run(){}
}
class NumThread1 implements Callable {
void call(){}
}
使用线程池创建新线程的好处:
1.提高响应速度,减少了创建新线程的时间
2.降低资源消耗,重复利用线程池中的线程,不需要每次都创建
3.便于线程管理
设置线程池的属性(大小,时间等等)