【JAVA-线程】Callable接口和线程池创建线程
一。Callable
步骤:
1.创建一个实现Callable接口的实现类
class CallableTest implements Callable{}
2.在Callable接口实现类中实现call()方法
public Object call() throws Exception{
return null;
}
3.创建Callable实现类对象
CallableTest callable = new CallableTest();
4.将Callable实现类对象 传递到FutureTask中,生成FutureTask对象
FutureTask futureTask = new FutureTask(callable);
5.将FutureTask对象传递到Thread构造器中,生成Thread对象并.start()调用
new Thread(futureTask).start();
6.如果需要call()方法的返回值,使用futureTask.get()
try {
//get 返回为call()方法的返回值
Object sum=futureTask.get();
System.out.println(sum);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
代码:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
//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 CallableDemo {
public static void main(String[] args) {
//3创建Callable接口实现类的对象
NumThread thread =new NumThread();
//4.将此Callable实现对象传递到FutureTask构造器中,创建FutureTask杜希昂
FutureTask futuretask = new FutureTask(thread);
//5.将FutureTask对象作为参数传递到Thread类构造器中,创建Thread对象,.start()方法调用
new Thread(futuretask).start();
try {
//get 返回为call方法的返回值
//6.获取Callable 中 call()方法的返回值
Object sum=futuretask.get();
System.out.println(sum);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
二。线程池
代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class PoolThread implements Runnable{
@Override
public void run() {
int sum=0;
for(int i=1;i<=100;i++) {
if(i%2==0) {
System.out.println(Thread.currentThread().getName()+"..."+i+"是偶数");
sum +=i;
}
}
}
}
public class ThreadPool {
public static void main(String[] args) {
ExecutorService service =Executors.newFixedThreadPool(10);
service.execute(new PoolThread());//适合使用Runnable
// service.submit();//适合使用Callable
service.shutdown();
}
}