线程中的同步和异步的区别

同步(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);
        }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值