在Java中共,共有四种方式可以创建线程,分别是
-
继承Thread类创建线程。
-
实现Runnable接口创建线程。
-
通过Callable和FutureTask创建线程。
-
通过线程池创建线程。
扩展
Runnable和Callable的区别
Runnable接口和Callable接口都可以用来创建线程,实现Runnable的时候,需要实现run方法;实现Callable接口的话,需要实现call方法。
Runnable的run方法无返回值,Callable的call方法有返回值,类型为Object。
Callable中可以抛出checked exception,而Runnable不可以。
Callable和Runnable都可以应用于executors。而Thread类只支持Runnable。
Future
Future是一个接口,代表了一个异步执行的结果。接口中的方法用来检查执行是否完成、等待完成和得到执行的结果。当执行完成后,只能通过get()方法得到结果,get方法会阻塞直到结果准备好了。如果想取消,那么调用cancel()方法。
FutureTask是Future接口的一个实现,它实现了一个可以提交给Executor执行的任务,并且可以用来检查任务的执行状态和获取任务的执行结果。
RutureTask和Callable示例
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* FutureTask和Callable示例
* 2024/3/19
*/
public class FutureAndCallableExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Callable<String> callable=()->{
System.out.println("Entered Callable");
Thread.sleep(2000);
return "Hello from Callable";
};
/*Callable<String> callable=new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("Entered Callable");
Thread.sleep(2000);
return "Hello from Callable";
}
};*/
FutureTask<String> futureTask = new FutureTask<>(callable);
Thread thread = new Thread(futureTask);
thread.start();
System.out.println("Do something else while callable is getting executed");
System.out.println("Retrieved: "+futureTask.get());
}
}
线程池和Callable的示例
import java.util.concurrent.*;
/**
* 线程池和Callable的示例
* 2024/3/19
*/
public class ExecutorsAndCallableExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executor= Executors.newSingleThreadExecutor();
Callable<String> callable = () ->{
System.out.println("Entered Callable");
Thread.sleep(2000);
return "Hello from Callable";
};
System.out.println("Submitting Callable");
Future<String> future = executor.submit(callable);
System.out.println("Do something else while callable is getting executed");
System.out.println("Retrieved: "+future.get());
executor.shutdown();
}
}