【多线程】Callable

目录

 

一,Callable和Runnable

 

 1.1 说明

二、例子


 

一,Callable和Runnable

先看一段例子

    class c implements Callable<String>{
		@Override
		public String call() throws Exception {
			return null;
		}
	}
	
	class r implements Runnable{
		@Override
		public void run() {
		}
	}

 

 1.1 说明

相同点:

1、两者都是接口

2、两者都需要调用Thread.start启动线程

不同点:

1、如上面代码所示,callable的核心是call方法,允许返回值,runnable的核心是run方法,没有返回值

2、call方法可以抛出异常,但是run方法不行

3、因为runnable是java1.1就有了,所以他不存在返回值,后期在java1.5进行了优化,就出现了callable,就有了返回值和抛异常

4、callable和runnable都可以应用于executors。而thread类只支持runnable

 

二、例子

public class Main {
  public static void main(String[] args) throws InterruptedException, ExecutionException {
  ExecutorService executor = Executors.newFixedThreadPool(2);
  //创建一个Callable,3秒后返回String类型
  Callable myCallable = new Callable() {
    @Override
    public String call() throws Exception {
      Thread.sleep(3000);
      System.out.println("calld方法执行了");
      return "call方法返回值";
    }
  };
  System.out.println("提交任务之前 "+getStringDate());
  Future future = executor.submit(myCallable);
  System.out.println("提交任务之后,获取结果之前 "+getStringDate());
  System.out.println("获取返回值: "+future.get());
  System.out.println("获取到结果之后 "+getStringDate());
  }
  public static String getStringDate() {
    Date currentTime = new Date();
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
    String dateString = formatter.format(currentTime);
    return dateString;
    }
  }

2.1 在使用完线程池后关闭方法

public static void main(String[] args) throws Exception{
		//1 创建一个线程池
		//调用Executors类的静态方法
		ExecutorService service = Executors.newFixedThreadPool(10);
		//2提交runnable对象
		service.submit(new Runnable() {
			@Override
			public void run() {
			}
		});
		//3 提交callable对象
		service.submit(new Callable<String>() {
			@Override
			public String call() throws Exception {
				return null;
			}
		});
		//4 关闭线程池
		service.shutdown();
	}

2.2 一个实际范例

    executorService.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    return operateLogDao.insert(operateLog);
                }
            });

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页