目录
1 Runnable 和 Callable 的相同点有:
1 都是实现多线程编程的接口;
2 都要实现一个方法,用于执行多线程任务:Runnable 实现 run() 方法,Callable 实现 call() 方法;
3 都用于创建线程,从而实现多线程编程;
2 Runnable 和 Callable 的不同点有
1 抛出异常的方式不同:Runnable 的 run() 方法只能抛出运行时异常,而 Callable 的 call() 方法可以抛出受检异常;
2 返回值类型不同:Runnable 的 run() 方法没有返回值,而 Callable 的 call() 方法返回一个泛型类型的结果;
3 适用场景不同:Runnable 用于执行没有返回值的异步任务,Callable 用于执行有返回值的异步任务;
4 获取返回执行结果的方式不同:Callable 的 call() 方法可以通过调用FutureTask.get()来获取执行结果,而 Runnable 不能返回执行结果。
3 线程的 run()和 start()有什么区别?
1 run() 方法是线程要执行的代码块,是线程体。
start() 方法用于启动子线程。
2 start() 方法被主线程调用后,会启动子线程,子线程进入就绪态,分配cpu后会自动调用 run() 方法中的代码块,接着主线程会直接继续执行start()方法后的代码,不用等待run方法体代码执行完毕。
如果直接调用 run() 方法,那就相当于在主线程中执行了一个普通的方法,并没有启动新的线程,则必须等待run()方法执行完毕才能执行下面的代码
3 run() 可以重复调用,而 start() 只能调用一次,否则会抛出 IllegalThreadStateException 异常。
总的来说,run() 方法是线程体,定义了线程要执行的任务,而 start() 方法则启动一个子线程,调用run() 方法执行任务。
4 什么是 Callable 和 Future?
Callable是实现多线程编程的接口,只有一个call()方法,用于执行异步任务并返回一个泛型对象,可以通过Future获取线程执行的结果。
Future是一个接口,用于表示一个异步任务计算的结果,常见的Future接口的实现类有FutureTask、CompletableFuture等。
Future对象,可以通过get()方法来获取异步任务的执行结果。如果任务还没有执行完成,get()方法会阻塞,直到任务执行完成并返回结果。
5 什么是 FutureTask
FutureTask是一个类,它实现了Future和Runnable接口,用于异步执行任务并获取任务执行结果。
由于 FutureTask 也是Runnable 接口的实现类,所以 FutureTask 也可以放入线程池中。
FutureTask的构造函数可以接受一个 Callable 的实现类对象,对这个异步运算的任务可以执行等待获取get()、判断是否已经完成isDone()、取消任务cancel()等操作。