1、继承Thread类重写run方法
2、实现Runnable接口实现多线程
3、通过Callable和FutureTask实现多线程
4、使用线程池创建多线程
Runnable和Callable的区别:?
Runnable和Callable都可以创建多线程,但是Runnable需要重写run方法,Callable需要实现call方法
Runnable的run方法无返回值,Callable的call方法有Object类型的返回值
Future?
Future是一个接口,代表一个异步执行的结果,接口中的方法用来检查执行是否完成、等待完成和得到执行的结果。当执行完成后,只能通过get方法得到结果,get方法会阻塞到有结果,可以通过cancel方法取消
FutureTask是Future接口的一个实现。
FutureTask和Callable代码示例:
public static void main(String[] args) throws ExecutionException, InterruptedException {
Callable<String> callable = ()->{
System.out.println("Callable");
Thread.sleep(2000);
return "Hello from Callable";
};
FutureTask<String> task = new FutureTask<>(callable);
Thread thread = new Thread(task);
thread.start();
System.out.println("返回:"+task.get());
}
线程池:
线程池和Callable示例:
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Callable<String> callable = ()->{
Thread.sleep(2000);
return "Hello from Callable";
};
Future<String> submit = executorService.submit(callable);
System.out.println("返回:"+submit.get());
}