1.什么是同步,什么是异步?
同步是指程序的执行按照预定的顺序,一个任务完成后才能进行下一个任务,在同步中,调用处会等到被调用方执行完毕并返回结果后,才能执行后续的代码,比如在Java中,正常的调用一个方法。
异步是指程序的执行不按照预定的顺序,调用方发出调用后,不等待被调用方返回结果,而是立刻执行后续的代码,被调用方在执行完成后,通过回调函数将结果通知给调用方,如axios异步请求。
2.什么是串行,什么是并行?
串行和并行是描述任务执行方式中的概念。
串行就是指任务或操作按照严格的先后顺序一个接一个地执行,在任何时刻,只有一个任务正在被执行,其他后续任务需要等到当前任务完成后才能开始执行。单线程下,任务就是串行方式执行的,程序语句按照顺序一个接一个执行。
并行是指多个任务在同一时间段内同时执行,各自执行自己的任务,互不影响,并行处理可以提高整体的处理速度,并行执行注重并发性和资源共享。
3.什么是同步任务,什么是异步任务?
同步任务是指按照代码顺序,一个接一个地执行任务,在同步任务中,调用方会等待被调用方执行完毕返回结果后,才能继续执行后续的代码,是顺序的执行,并且是阻塞调用。
当同步任务放入串行队列中执行,会按照顺序执行,同步任务会阻塞调用它的线程,下一个同步任务必须等待前一个任务完成后才能开始执行。 当同步任务放入并发队列中执行,还是阻塞性的,会按照顺序执行,尽管并发队列允许并发执行,但同步任务实际上会串行化它们的执行。
异步任务是指不按照代码顺序执行,调用方发出调用后,不需要等待被调用方返回的结果,而是立即执行后续的代码,被调用方在执行完成后,通过回调函数将结果通知给调用方,非顺序的进行,并且是非阻塞的调用,任务之间可以独立的运行和完成。
当异步任务放入串行队列中执行,即使任务是异步的不会阻塞,但后面的还是必须等待前面的任务完成后才能开始,从队列角度看,也是顺序执行。 当异步任务放入并发队列中执行,异步任务不会阻塞调用它的线程,它们可以在不同的线程上并发执行,而无需等待其他任务的完成。
4.同步线程和异步线程的区别?
我觉得同步线程和异步线程的主要区别体现在线程的执行顺序上吧。
同步线程意味这多个线程是按照一定的顺序去执行的,每一个线程都需要等待前一个线程执行完毕之后才能开始执行,一般用于需要严格控制执行顺序的场景,可以采取一些同步的方式,如wait()和notify()、JUC中的一些辅助类countdownLatch来进行实现。
异步线程是指多个线程之间的执行顺序是不确定的,每一个线程是独立执行的,互不干扰,异步线程就是可以同时处理多个任务,而不需要等待其他任务的完成情况。
所以同步线程强调线程之间的顺序执行和可预测性,而异步线程则注重线程的独立性和并行处理能力。
5.什么是串行队列,什么是并发队列?
串行队列和并发队列是用于任务调度的两种队列类型吧。
串行队列在同一时间只允许一个任务被执行,队列中的任务会按照它们被添加的顺序一个接一个的执行,每一个任务必须等待前一个任务完成后才能开始执行,特点就是顺序执行,并且无并发性吧,就是同一时间只有一个任务在执行。
并发队列允许多个任务同时执行,虽然任务也是按照它们添加进队列的顺序开始执行,但是在同一时间,可能就会有多个任务在并发执行,虽然任务是按照顺序开始的,但是执行无序的,可能最终会以不同的顺序完成。