同步与异步、并发和并行、阻塞和非阻塞
同步和异步
同步和异步通常用来形容一次方法的调用。同步方法的调用必须等到该方法返回后才能继续接下来的行为。异步方法更像一个消息传递,一旦调用就会立即返回,调用者可以继续接下来的操作,而异步方法通常会在另一个线程中执行,不会妨碍调用者的工作。
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的系统才会出现并行。
阻塞和非阻塞
阻塞和非阻塞是形容多线程间的相互影响。比如一个线程占用了临界区的资源,那么其他线程需要这个资源的线程就只能等待,等待会导致线程挂起,这就是阻塞。非阻塞就是与之相反,它强调没有一个线程可以妨碍其他线程执行,所有的线程都会尝试不断向前执行。