同步与异步
同步和异步通常用来形容一次方法的调用。同步方法的调用必须等到该方法返回后才能继续接下来的行为。异步方法更像一个消息传递,一旦调用就会立即返回,调用者可以继续接下来的操作,而异步方法通常会在另一个线程中执行,不会妨碍调用者的工作。
public class SyncDemo {
public static void main(String[] args) {
//同步调用
//模拟看电视和洗衣服两个行为,同步调用就是得先把衣服洗完了才能看电视,必须等待洗衣服方法的执行完成才能接着执行看电视方法
SyncDemo.washClothes();
SyncDemo.watchTV();
//异步调用
//类似于将衣服丢进洗衣机去洗,不用等待衣服洗完我就可以去看电视,两个方法可以同时执行
new Thread(() -> SyncDemo.washClothes()).start();
SyncDemo.watchTV();
}
//洗衣服方法
public static void washClothes(){
System.out.println("正在洗衣服");
try {
Thread.sleep(3000);//模拟洗衣服过程
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("衣服洗完了");
}
//看电视方法
public static void watchTV(){
System.out.println("看电视");
}
}
并发和并行
并发和并行都可以表示多个任务一起执行,但是侧重点不同。并发偏重于多个任务交替执行,而多个任务有可能还是串行的,而并行是真正意义上的“同时执行”。如果系统只有一个CPU,而使用多线程任务,那么这些任务是不可能并行的,一个CPU一次只能执行一条命令,在这种情况下多线程就是并发的,而不是并行的。只有多个CPU的系统才会出现并行。
阻塞和非阻塞
阻塞和非阻塞是形容多线程间的相互影响。比如一个线程占用了临界区的资源,那么其他线程需要这个资源的线程就只能等待,等待会导致线程挂起,这就是阻塞。非阻塞就是与之相反,它强调没有一个线程可以妨碍其他线程执行,所有的线程都会尝试不断向前执行。