模拟买票小练习-线程资源同步小练习-synchronized使用

网友投稿 536 2022-05-29

模拟买票练习多线程

使用Thread和Runable练习买票和练习共享资源问题

方式一:继承Thread类

1.首先定义一个ticks变量为总票数为10

1

2.定义run方法,循环的扣除票数量(简单写一下打印ticks票数)

1

3.模拟四个窗口购买票

1

问题1:打印的结果是每个窗口都打印了10张票,也就是说变量tickets没有共享

解决1:通过给变量添加static,使变量变为共享变量如(代码1)

模拟买票小练习-线程资源同步小练习-synchronized使用

解决2:通过实现runable接口解决共享变量问题(代码2)

问题2:打印的ticks数量顺序不是从10->1,顺序乱了,也就是数据不同步

解决:通过代码块同步或者方法同步解决问题(加锁)(代码3、4)

代码1:

package com.lzw.java_thread.tickets;/**  * 使用Thread和Runable练习买票和练习共享资源问题  * 方式一:继承Thread类  *      1.首先定义一个ticks变量为总票数为10  *      2.定义run方法,循环的扣除票数量(简单写一下打印ticks票数)  *      3.模拟四个窗口购买票  */public class ThreadTicks extends Thread{     private static int tickets = 10;     @Override     public void run() {         while (tickets>0){             try {                 Thread.sleep(1);             } catch (InterruptedException e) {                 e.printStackTrace();             }             synchronized (this){                 if (tickets>0){                     System.out.println(Thread.currentThread().getName() + " 剩余" + (tickets--) + "张票");                 }             }         }     }     public static void main(String[] args) {         ThreadTicks tt1 = new ThreadTicks();         ThreadTicks tt2 = new ThreadTicks();         ThreadTicks tt3 = new ThreadTicks();         ThreadTicks tt4 = new ThreadTicks();         tt1.start();         tt2.start();         tt3.start();         tt4.start();     }}1234567891011121314151617181920212223242526272829303132333435363738

代码2:

package com.lzw.java_thread.tickets;/**  *第二种方式:  *      1.实现Runable接口  *      2.创建四个线程都传入一个Runable子类,实现对象资源共享  *      3.调用start()方法  */public class RunableTickets implements Runnable{     private int tickets = 10;     @Override     public void run() {         while (tickets>0){             try {                 Thread.sleep(1);             } catch (InterruptedException e) {                 e.printStackTrace();             }             if (tickets>0){                 System.out.println(Thread.currentThread().getName()+" 剩余"+(tickets--)+"张票");             }         }     }     public static void main(String[] args) {         RunableTickets rtt = new RunableTickets();         Thread td1 = new Thread(rtt);         Thread td2 = new Thread(rtt);         Thread td3 = new Thread(rtt);         Thread td4 = new Thread(rtt);         td1.start();         td2.start();         td3.start();         td4.start();     }}123456789101112131415161718192021222324252627282930313233343536

代码3:

package com.lzw.java_thread.tickets;/**  * @Auther: lzw  * 使用同步代码块,实现共享资源同步  */public class RunableTickets1 implements Runnable{     private int tickets = 10;     @Override     public void run() {         while (tickets>0){             try {                 Thread.sleep(100);             } catch (InterruptedException e) {                 e.printStackTrace();             }             synchronized (this){                 if (tickets>0){                     System.out.println(Thread.currentThread().getName()+" 剩余"+(tickets--)+"张票");                 }             }         }     }     public static void main(String[] args) {         RunableTickets1 rtt = new RunableTickets1();         Thread td1 = new Thread(rtt);         Thread td2 = new Thread(rtt);         Thread td3 = new Thread(rtt);         Thread td4 = new Thread(rtt);         td1.start();         td2.start();         td3.start();         td4.start();     }}12345678910111213141516171819202122232425262728293031323334353637

代码4:

package com.lzw.java_thread.tickets;/**  * @Auther: lzw  * 使用同步方法,实现共享资源同步  */public class RunableTickets2 implements Runnable{     private int tickets = 10;     @Override     public void run() {         while (tickets>0){             try {                 Thread.sleep(100);             } catch (InterruptedException e) {                 e.printStackTrace();             }                 this.sale();         }     }     public synchronized void sale(){         if (tickets>0){             System.out.println(Thread.currentThread().getName()+" 剩余"+(tickets--)+"张票");         }     }     public static void main(String[] args) {         RunableTickets2 rtt = new RunableTickets2();         Thread td1 = new Thread(rtt);         Thread td2 = new Thread(rtt);         Thread td3 = new Thread(rtt);         Thread td4 = new Thread(rtt);         td1.start();         td2.start();         td3.start();         td4.start();     }}

任务调度

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《Office 2019高效办公三合一从入门到精通 : 视频自学版》 —2.3.2使用批注
下一篇:由浅入深CAS
相关文章