服务器之家

服务器之家 > 正文

java多线程模拟实现售票功能

时间:2021-12-07 13:41     来源/作者:最好的硕硕

铁道部发布了一个售票任务,要求销售1000张票,要求有3个窗口来进行销售,请编写多线程程序来模拟这个效果。

1 线程类

测试方法:

?
1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
    MyThread t1 = new MyThread("窗口1");
    MyThread t2 = new MyThread("窗口1");
    MyThread t3 = new MyThread("窗口1");
 
    t1.start();
    t2.start();
    t3.start();
 
}

1.1 局部加锁

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class MyThread extends Thread{
 
 private static int ticket = 1000;
 private static Object obj = new Object();
 
 public MyThread(String name) {
  super(name);
 }
 
 @Override
 public void run() {
  
  while(ticket > 0){
   synchronized(obj){
    if(ticket > 0){
     System.out.println(Thread.currentThread().getName() + "正在销售第" +(1001-ticket)+ "张票");
     ticket--;
    }
    if(ticket <= 0){
     System.out.println(Thread.currentThread().getName() + "票已售罄");
    }
   }
  }
 }
}

1.2 方法加锁

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class MyThread extends Thread{
 
 private static int ticket = 1000;
 
 public MyThread(String name) {
  super(name);
 }
 
 @Override
 public void run() {
  
  while(ticket > 0){
   method02();
  }
 }
 
 //锁对象:类的字节码文件对象(MyThread.class),有static修饰
 public static synchronized void method02(){
  if(ticket > 0){
   System.out.println(Thread.currentThread().getName() + "正在销售第" +(1001-ticket)+ "张票");
   ticket--;
  }
  if(ticket <= 0){
   System.out.println(Thread.currentThread().getName() + "票已售完");
  }
 }
}

1.3 手动加锁

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class MyThread extends Thread{
 
 private static int ticket = 1000;
 private static Lock lock = new ReentrantLock();
 
 public MyThread(String name) {
  super(name);
 }
 
 @Override
 public void run() {
  
  while(ticket > 0){
   lock.lock();//手动上锁
   if(ticket > 0){
    System.out.println(Thread.currentThread().getName() + "正在销售第" +(1001-ticket)+ "张票");
    ticket--;
   }
   if(ticket <= 0){
    System.out.println(Thread.currentThread().getName() + "票已售完");
   }
   lock.unlock();//手动解锁
  }
 }
}

2 任务类

测试方法:

?
1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
    Task task = new Task();
    Thread t1 = new Thread(task, "窗口1");
    Thread t2 = new Thread(task, "窗口2");
    Thread t3 = new Thread(task, "窗口3");
    t1.start();
    t2.start();
    t3.start();
 
}

2.1 局部加锁

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Task implements Runnable{
 private int tickets=1000;
 
 @Override
 public void run() {
  while(tickets>0){
   synchronized (this) {
    if(tickets > 0)
             {
                 System.out.printf ("%s窗口正在售出第%d张票\n",Thread.currentThread().getName(),1001-tickets);
                 tickets--;
             }
             if(tickets<=0){
              System.out.printf("%s窗口售罄\n",Thread.currentThread().getName());
             }
   }
   
  }
 }
}

2.2 方法加锁

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Task implements Runnable{
 private int tickets=1000;
 
 @Override
 public void run() {
  while(tickets>0){
   method(); 
  }
 }
    //方法加锁,没有使用static修饰
 public synchronized void method(){
  if(tickets > 0)
        {
            System.out.printf ("%s窗口正在售出第%d张票\n",Thread.currentThread().getName(),1001-tickets);
            tickets--;
        }
        if(tickets<=0){
         System.out.printf("%s窗口售罄\n",Thread.currentThread().getName());
        }
 }
}

2.3 手动加锁

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
public class Task implements Runnable{
 private int tickets=1000;
 private Lock lock =new  ReentrantLock();
 @Override
 public void run() {
  while(tickets>0){
   lock.lock();//手动上锁
   if(tickets > 0)
            {
                System.out.printf ("%s窗口正在售出第%d张票\n",Thread.currentThread().getName(),1001-tickets);
                tickets--;
            }
            if(tickets<=0){
             System.out.printf("%s窗口售罄\n",Thread.currentThread().getName());
            }
            lock.unlock();//手动关锁
  }
 }
}

效果截图:

java多线程模拟实现售票功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/DengShuo_shuai/article/details/119712285

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部