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

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

1 线程类

测试方法:

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 局部加锁

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 方法加锁

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 手动加锁

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 任务类

测试方法:

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 局部加锁

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 方法加锁

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 手动加锁

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多线程模拟实现售票功能 的全部内容, 来源链接: utcz.com/p/248279.html

回到顶部