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

来源:互联网 发布:php选择题答题系统 编辑:程序博客网 时间:2024/06/09 14:39

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

 

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

这个是思考原子性的范围

原创粉丝点击