同步(Sync)
所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。
根据这个定义,Java中所有方法都是同步调用,应为必须要等到结果后才会继续执行。我们在说同步、异步的时候,一般而言是特指那些需要其他端协作或者需要一定时间完成的任务。
简单来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。
异步(Async)
异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。
举个例子简单
同步:火车站多个窗口卖火车票,假设A窗口当卖第88张时,在这个短暂的过程中,其他窗口都不能卖这张票,也不能继续往下卖,必须这张票处理完其他窗口才能继续卖票。直白点说就是当你看见程序里出现synchronized这个关键字,将任务锁起来,当某个线程进来时,不能让其他线程继续进来,那就代表是同步了。
异步:当我们用手机下载某个视频时,我们大多数人都不会一直等着这个视频下载完,而是在下载的过程看看手机里的其他东西,比如用qq或者是微信聊聊天,这种的就是异步,你执行你的,我执行我的,互不干扰。比如上面卖火车票,如果多个窗口之间互不影响,我行我素,A窗口卖到第88张了,B窗口不管A窗口,自己也卖第288张票,那显然会出错了。
编写一个Java 多线程程序,完成三个售票窗口同时出售20张票(如下图所示)
程序分析:
1.票数要使用同一个静态值;
2.为保证不会出现卖出同一个票数,要java多线程同步锁。
设计思路:
1.创建一个站台类Station,继承Thread,重写run方法,在run方法里面执行售票操作!售票要使用同步锁:即有一个站台卖这张票时,其他站台要等这张票卖完!
2.创建主方法调用类
public class Station implements Runnable {
private static int num=20;
private static String buy="买票控制";
@Override
public void run() {
while (this.num>0){
synchronized (buy){
if(this.num>0){
System.out.println(Thread.currentThread().getName()+"售出一张票"+
"还剩"+--this.num+"张");
}
}
}
}
}
编写测试类
public class test {
public static void main (String args[]) {
//final CountDownLatch countDownLatch = new CountDownLatch(1);
Station a = new Station();
Thread a1 = new Thread(a);
Thread a2 = new Thread(a);
a1.setName("车站一");
a2.setName("车站二");
a1.start();
//第一个线程的名字为车站一
a2.start();
//第二个线程的名字为车站二
/*try {
countDownLatch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
//System.exit(0);
}
}