分享21道并发编程面试题 1.进程和线程还有协程之间的关系
进程:运行起来的程序。进程需要占用系统资源(内存,CPU)。进程是最小的系统资源分配单位,只是给线程提供执行环境。 由于一个进程产生一个进程地址空间,且进程地址空间相互独立,一个进程死亡,其他进程不会受到影响。
线程:LWP(light weight process)轻量级进程。线程是最小的执行单位。CPU分配时间轮片的对象。
协程:coroutine,也叫轻量级线程。 与传统的系统级线程和进程相比,携程最大的优势在于“轻量级”,可以轻松创建上万个而不会导致系统资源衰歇。
2.并发和并行之间的区别 并发:指统一时间内,宏观上处理多个任务
并行:指统一时间内,真正上处理多个任务
3.1 继承Thread类,重写run方法;
3.2 实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
3.3 通过Callable和FutureTask创建线程
3.4 通过线程池创建线程
4.Callable和Future模式 4.1 Callable在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口。然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果。我们一般只能采用共享变量或共享存储区以及线程通信的方式实现获得任务结果的目的。 不过,Java中,也提供了使用Callable和Future来实现获取任务结果的操作。Callable用来执行任务,产生结果,而Future用来获得结果。
不过,在java中,也提供了使用Callable和Future来实现获取任务结果的操作。Callable用来执行任务,产生结果,而Future用来获得结果;
@FunctionalInterface public interface Callable<V> { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute a result */ V call() throws Exception; }
Callable和Runnable的区别:
1.Callable能接受一个泛型,然后在call方法中返回一个这个类型的值,而Runnable的run方法没有返回值;
2.Callable的call方法可以抛出异常,而Runnable的run方法不会抛出异常;
4.2 FutureFuture模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑
Futrure模式:对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再取真实的结果。
package com.wn.callable; import java.util.concurrent.*; public class MyCallable implements Callable { @Override public Object call() throws Exception { System.out.println("callable接口中重写的call方法,可以有返回值并且抛出异常!!!"); return "callable"; } //方案二:submit(Callable task) public static void main(String[] args) throws ExecutionException, InterruptedException { MyCallable myCallable = new MyCallable(); //创建一个线程 ExecutorService executorService = Executors.newFixedThreadPool(3); //创建线程执行任务,接受任务结果 Future submit = executorService.submit(myCallable); //接受返回值,get方法会阻塞当前线程 System.out.println(submit.get()); System.out.println("利用线程池执行mycallable,完毕!!!"); //停止 executorService.shutdown(); } }
4.3 Future常用方法V get():获取异步执行的结果,如果没有结果可用,此方法会阻塞知道异步计算完成;