同步与异步、并发和并行、阻塞和非阻塞

时间:2023-01-21 17:58:08

同步和异步

同步和异步通常用来形容一次方法的调用。同步方法的调用必须等到该方法返回后才能继续接下来的行为。异步方法更像一个消息传递,一旦调用就会立即返回,调用者可以继续接下来的操作,而异步方法通常会在另一个线程中执行,不会妨碍调用者的工作。

 1 public class SyncDemo {
 2 
 3     public static void main(String[] args) {
 4         //同步调用
 5         //模拟看电视和洗衣服两个行为,同步调用就是得先把衣服洗完了才能看电视,必须等待洗衣服方法的执行完成才能接着执行看电视方法
 6         SyncDemo.washClothes();
 7         SyncDemo.watchTV();
 8         //异步调用
 9         //类似于将衣服丢进洗衣机去洗,不用等待衣服洗完我就可以去看电视,两个方法可以同时执行
10         new Thread(() -> SyncDemo.washClothes()).start();
11         SyncDemo.watchTV();
12     }
13 
14     //洗衣服方法
15     public static void washClothes(){
16         System.out.println("正在洗衣服");
17         try {
18             Thread.sleep(3000);//模拟洗衣服过程
19         } catch (InterruptedException e) {
20             e.printStackTrace();
21         }
22         System.out.println("衣服洗完了");
23     }
24 
25     //看电视方法
26     public static void watchTV(){
27         System.out.println("看电视");
28     }
29 }

并发和并行

并发和并行都可以表示多个任务一起执行,但是侧重点不同。并发偏重于多个任务交替执行,而多个任务有可能还是串行的,而并行是真正意义上的“同时执行”。如果系统只有一个CPU,而使用多线程任务,那么这些任务是不可能并行的,一个CPU一次只能执行一条命令,在这种情况下多线程就是并发的,而不是并行的。只有多个CPU的系统才会出现并行。

阻塞和非阻塞

阻塞和非阻塞是形容多线程间的相互影响。比如一个线程占用了临界区的资源,那么其他线程需要这个资源的线程就只能等待,等待会导致线程挂起,这就是阻塞。非阻塞就是与之相反,它强调没有一个线程可以妨碍其他线程执行,所有的线程都会尝试不断向前执行。