这是个卖票实例,采用多线程,模拟不同窗口来卖票,票数是共同资源。
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
这个是思考原子性的范围