之前通过继承Thread类实现多线程,通过Runnable接口+静态代理实现多线程
但是有一个不足之处是,重写run方法时没有返回值也不能抛出异常
使用Callable接口就可以解决这个问题
Callable接口和Runnable接口的不同之处:
1.Callable规定的方法是call,而Runnable是run
2.call方法可以抛出异常,但是run方法不行
3.Callable对象执行后可以有返回值,运行Callable任务可以得到一个Future对象,通过Future对象可以了解任务执行情况,可以取消任务的执行,而Runnable不可有返回值
多线程的实现有以下4个步骤:
1.创建一个线程,创建Callable的实现类Race,并且重写call方法
ExecutorService ser=Executors.newFixedThreadPool(线程数目);
Race tortoise = new Race();
2.得到Future对象
Future<Integer> result=ser.submit(tortoise);
3.获取返回值
int num=result.get();
4.停止服务
ser.shutdown();
举一个龟兔赛跑的例子,直接上代码吧
- public class Call {
-
- public static void main(String[] args) throws InterruptedException, ExecutionException {
-
- ExecutorService ser=Executors.newFixedThreadPool(2);
-
- Race tortoise=new Race("tortoise",1000);
- Race rabbit = new Race("rabbit",500);
-
-
-
- Future<Integer> resultR=ser.submit(rabbit);
- Future<Integer> resultT=ser.submit(tortoise);
-
- Thread.sleep(3000);
- rabbit.setFlag(false);
- tortoise.setFlag(false);
-
- int numR=resultR.get();
- int numT=resultT.get();
-
- System.out.println("rabbit ---"+numR);
- System.out.println("tortoise ---"+numT);
-
-
- ser.shutdown();
- }
- }
-
- class Race implements Callable<Integer>{
-
- private int step=0;
- private String name;
- private long time;
- private boolean flag=true;
-
- Race(String name,long time){
- this.name=name;
- this.time=time;
- }
-
- @Override
- public Integer call() throws Exception {
- while(flag){
- Thread.sleep(time);
- step++;
- }
- return step;
- }
-
- public void setFlag(boolean flag){
- this.flag=flag;
- }
- }