java多线程之Runnable同时执行同一资源实例

这是个卖票实例,采用多线程,模拟不同窗口来卖票,票数是共同资源。

 

piao.java

package tong;

public class piao implements Runnable {
    private static int count = 10;

    @Override

    public void run() {

        while (count > 0) {
            try {
                Thread.sleep(23);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            synchronized (this) {
                if (count > 0) {
                    count--;
                    System.out.println(Thread.currentThread().getName() + "卖出一张票,票还剩" + count);
                }

            }

        }

    }

}

chuangkou.java

package tong;

public class chuangkou {
public static void main(String[] args) {
    piao piao =new piao();
    
    Thread thread1 =new Thread(piao,"窗口1");
    Thread thread2 =new Thread(piao,"窗口2");
    Thread thread3 =new Thread(piao,"窗口3");
    Thread thread4 =new Thread(piao,"窗口4");
    thread1.start();
    thread2.start();
    thread3.start();
    thread4.start();
}  
}

开启四个窗口同时卖票,结果如下

窗口4卖出一张票,票还剩9
窗口1卖出一张票,票还剩8
窗口2卖出一张票,票还剩7
窗口3卖出一张票,票还剩6
窗口2卖出一张票,票还剩5
窗口1卖出一张票,票还剩4
窗口3卖出一张票,票还剩3
窗口4卖出一张票,票还剩2
窗口4卖出一张票,票还剩1
窗口1卖出一张票,票还剩0

多线程Runnable同时执行同一资源,必须考虑代码的原子性,对于初学者来说,线程访问的随机性,以及资源的分配有时分不清,初学者学一下java的原子性,可见性,有序性。就对这些问题清清楚楚了。

还有第一个程序piao.java,大家考虑两个问题

第一:把if (count>0){}去掉的结果

窗口3卖出一张票,票还剩9
窗口2卖出一张票,票还剩8
窗口1卖出一张票,票还剩7
窗口4卖出一张票,票还剩6
窗口4卖出一张票,票还剩5
窗口3卖出一张票,票还剩4
窗口2卖出一张票,票还剩3
窗口1卖出一张票,票还剩2
窗口3卖出一张票,票还剩1
窗口1卖出一张票,票还剩0
窗口2卖出一张票,票还剩-1
窗口4卖出一张票,票还剩-2
窗口3卖出一张票,票还剩-3

这个是思考线程的控制

第二:保持第一步。然后把synchronized改成把while(count>0)括住

窗口1卖出一张票,票还剩9
窗口1卖出一张票,票还剩8
窗口1卖出一张票,票还剩7
窗口1卖出一张票,票还剩6
窗口1卖出一张票,票还剩5
窗口1卖出一张票,票还剩4
窗口1卖出一张票,票还剩3
窗口1卖出一张票,票还剩2
窗口1卖出一张票,票还剩1
窗口1卖出一张票,票还剩0

这个是思考原子性的范围

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值