线程的实现方式三:实现Callable接口 --JDK5.0新增
package com.cjf.ThreadTest34;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* Created with IntelliJ IDEA.
* Description:
* Author: Everything
* Date: 2020-07-02
* Time: 15:37
*/
//线程的实现方式三:实现Callable接口 --JDK5.0新增
//如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大?
// 1. call() 可以有返回值的。
// 2. call()可以抛出异常,被外面的操作捕获,获取异常的信息
// 3. Callable是 支持泛型的
//1.实现Callable的类
class NumThread implements Callable{
//2.重写call方法
@Override
public Object call() throws Exception {
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 2==0){
System.out.println(i);
sum += i;
}
}
return sum;
}
}
public class ThreadTest3 {
public static void main(String[] args) {
//3.实例化NumThread对象
NumThread numThread = new NumThread();
//4,将此numThread对象传递到FutureTask的构造器中
FutureTask futureTask = new FutureTask(numThread);
//5.和runnable一样,当做对象参数传递到Thread构造器中,创建线程
Thread thread = new Thread(futureTask);
thread.start();
//6.如果不想获取Callable的返回值,可以省略掉这一步
try {
//get方法的返回值即为FutureTask构造器参数Callable实现类重写的call()的返回值。
Object sum = futureTask.get();
System.out.println("总和为:"+sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
第四种方法:线程池
package com.cjf.ThreadTest34;
import java.util.concurrent.*;
/**
* Created with IntelliJ IDEA.
* Description:
* Author: Everything
* Date: 2020-07-02
* Time: 15:57
*/
//第四种方法:线程池
// 1.提高响应速度(减少了创建新线程的时间)
// 2.降低资源消耗(重复利用线程池中线程,不需要每次都创建)
// 3.便于线程管理
class NumberThread implements Runnable{
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
if (i % 2==0){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
}
class NumberThread1 implements Callable{
@Override
public Object call() throws Exception {
for (int i = 1; i <= 100; i++) {
if (i % 2!=0){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
return null;
}
}
public class ThreadTest4 {
public static void main(String[] args) {
//1.创建线程池,指定线程数量
ExecutorService Service = Executors.newFixedThreadPool(10);
//2.将线程赋予对象
Service.execute(new NumberThread());//适用于Runnable
//3.将线程赋予对象
NumberThread1 numberThread1 = new NumberThread1();
FutureTask futureTask = new FutureTask(numberThread1);
Service.submit(futureTask);//适用于Callable
//4.关闭线程池
Service.shutdown();
}
}