多线程的应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程的应用相关的知识,希望对你有一定的参考价值。

需求描述

1. 三个线程,名称分别为“张三”、“李四”、“票贩子”,共同抢100张火车票。

2. 每个线程抢到一张票后,都必须休眠500毫秒,用来模拟网络延时。

3. 限“票贩子”只能抢一张票。

 

 1 public class TicketOffice implements Runnable {
 2     private int count = 100; // 记录剩余票数
 3     private int no = 0; // 记录买到第几张票
 4     private boolean flag = false; //记录是否售完
 5     public boolean x=false;
 6     public void run() {      
 7         while (true) {
 8             sale();
 9             if(count<=0){
10                 break;
11             }
12         }
13     }
14     // 卖票
15      public boolean sale() {
16         if (flag==true) {
17             return false;
18         }
19         // 第一步:设置买到第几张票和剩余票数
20         no++;
21         count--;
22         try {
23             Thread.sleep(500);
24             // 模拟网络延时
25         } catch (InterruptedException e) {
26             e.printStackTrace();
27         }
28         // 第二步:显示信息
29         System.out.println(Thread.currentThread().getName() + "抢到第" + no + "张票," + "剩余" + count + "张票!");
30         if(count<=0){
31             flag=true;
32             return false;
33         }
34         if(Thread.currentThread().getName().equals("票贩子")){
35             Thread.currentThread().stop();
36         }
37         return true;
38     }
39 }
40  
41 public class Test {
42     public static void main(String[] args) {
43         TicketOffice ticket =new TicketOffice();
44         new Thread(ticket,"张三").start();
45         new Thread(ticket,"李四").start();
46         new Thread(ticket,"票贩子").start();       
47     }
48 }
 1 public class TicketOffice implements Runnable {
 2     private int count = 100; // 记录剩余票数
 3     private int no = 0; // 记录买到第几张票
 4     private boolean flag = false; //记录是否售完
 5     public void run() {
 6         while (true) {
 7             sale();
 8             if(count<=0){
 9             break;
10             }
11         }
12     }
13     // 卖票
14      public synchronized boolean sale() {//同步
15         if (flag==true) {
16             notify();
17             return false;
18         }
19         // 第一步:设置买到第几张票和剩余票数
20         no++;
21         count--;
22         try {
23             Thread.sleep(500);
24             // 模拟网络延时
25         } catch (InterruptedException e) {
26             e.printStackTrace();
27         }
28         // 第二步:显示信息
29         System.out.println(Thread.currentThread().getName() + "抢到第" + no + "张票," + "剩余" + count + "张票!");
30         if(count<=0){
31             flag=true;
32             return false;
33         }
34         if(Thread.currentThread().getName().equals("票贩子")){
35             try {
36                 this.wait();
37             } catch (InterruptedException e) {
38                 e.printStackTrace();
39             }
40         }
41         return true;
42     }
43 }
44 
45  public class Test {
46     public static void main(String[] args) {
47         TicketOffice ticket =new TicketOffice();
48         new Thread(ticket,"张三").start();
49         new Thread(ticket,"李四").start();
50         new Thread(ticket,"票贩子").start();
51     }
52 }

 

以上是关于多线程的应用的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程与并发库高级应用-工具类介绍

Java多线程与并发库高级应用-工具类介绍

多个用户访问同一段代码

线程学习知识点总结

多个请求是多线程吗

应用程序可能在 Andriod 中的主线程(Firebase 数据库)上做了太多工作