多线程的实现有三种方式:
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口,不过该方式需要利用线程池
第一种和第二种方式比较简单,就不赘述了;主要是讲解第三种方式。
实现Callable接口的例子:
package executorpool;
import java.util.concurrent.Callable;
public class MyCallable1 implements Callable<Integer> {
private int number;
public MyCallable1(int m){
this.number=m;
}
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
int sum=0;
for(int x=0;x<=number;x++){
sum +=x;
}
return sum;
}
}
测试实现Callable接口的demo:
package executorpool;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
public class CallableDemo2 {
public static void main(String[] args) throws InterruptedException, ExecutionException{
//创建线程对象
ExecutorService pool=Executors.newFixedThreadPool(2);
//可以执行Runnable对象或者Callable对象代表的线程
FutureTask<Integer> f1= (FutureTask<Integer>) pool.submit(new MyCallable1(100));
Future<Integer> f2= pool.submit(new MyCallable1(200));
//获取它的值
int totalOne=f1.get();
int totalTwo=f2.get();
//然后打印它的值
System.out.println(totalOne);
System.out.println(totalTwo);
//关闭线程池
pool.shutdown();
}
}
计算结果:
5050
20100
利用线程池实现Callable接口 ,可以向方法里面传递参数,有一个泛型去接收参数!上面线程池的例子,就通过两个线程分别计算加法值,利用Future接口去接收,通过future接收之后 ,再可以利用get方法去获取里面的值;其中FutureTask是Future接口的一个实现类;