「java多线程卖票」java多线程售票

博主:adminadmin 2023-03-17 07:32:06 386

本篇文章给大家谈谈java多线程卖票,以及java多线程售票对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java多线程的卖票问题

首先,定义的锁(lock)不对,必须是同一个锁,像你这样用this,new多少个MyThread就有多少个锁,违反了线程的同步机制;

其次,你如果想要呈现多线程的竞争,不可以在run方法里让一个线程一直运行而不释放锁,应该使用wait()/notify();

以下我稍微修改下,会形成两个线程交替执行的情形:

public class ThreadTest {

public static Object obj = new Object();

public static int number = 10;// 用static共享票源,不知道可以不,按理说是可以的

/**

 * @param args

 */

public static void main(String[] args) {

// TODO Auto-generated method stub

MyThread my = new MyThread();

MyThread my2 = new MyThread();

Thread t1 = new Thread(my2, "2号窗口");

Thread t2 = new Thread(my, "1号窗口");

t1.start();

t2.start();

}

static class MyThread implements Runnable {

public void run() {

while (true)

synchronized (obj) {

if (number  0) {

System.out.println(Thread.currentThread().getName()

+ "正在卖票," + "还剩" + number + "张票");

number--;

obj.notifyAll();

try {

obj.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

} else

break;

}

}

}

}

100张票,用java多线程实现3个窗口按顺序依次卖票,如何实现

很简单, 出票里加锁就行了完整代码:

public class Test {

public static void main(String[] args) {

for(int i=0; i3; i++){

new Thread("线程 " + i){

public void run() {

while(true){

int p = getNumber();

if(p 0 ){

System.out.println(getName() + " 票号: " + p);

}else{

System.out.println("没票了");

break;

}

}

};

}.start();

}

}

public static int num = 100; //总票数

/**

 * synchronized 同步锁

 * @return

 */

public static synchronized int getNumber(){

if(num 0){

return num --; //如果大于0, 则返回当前票并减少一张

}

return 0;

}

}

java中多线程卖票的记录怎么存储到Map集合总

定义类变量 ,,,,,,,,,,,,,,在方法中、或类变量 使用前,使用线程锁。。。。。。。。。。

java 中多线程中的四个窗口卖100张票问题 我的答案是

你的答案有两个问题:

1,obj不是static,就是说每个线程都有自己的obj,synchronize锁的是自己线程的obj,不能起到阻塞其它线程的作用。运行的话会看到有的票被出售多次。

2,while (num 0)在syncronize之外,因为没被同步,其它线程可能在对比num 0之后修改num的值,可能导致计数为负数的票被卖出,或者其它奇怪的结果。

所以最后的答案才能得到可靠的结果。

java多线程问题,火车票买票

楼上答案是正解,你一直用一个对象的在set,共享了同一个对象.其实也没用新建5个对象.

可以set之后就开始执行.但是多线程的意义可能不大了.

package com.experiment9;

public class Ticket extends Thread {

public Ticket(String s){

super(s);

}

int num=100; //静态变量

public void run(){

while(true){

synchronized (" "){ //同步块实现多线程

if(num0){

try {

Thread.sleep(500); //线程休眠10毫秒

}catch (Exception e){

e.printStackTrace();

}

System.out.println(this.getName()+"------------------------"+(num--));

}

}

}

}

public static void main(String[] args) { //main 函数

Ticket ticket =new Ticket("5号窗口");

Thread thread_5=new Thread(ticket);

ticket.setName("一号窗口");

thread_5.start();

Thread thread_1=new Thread(ticket);

ticket.setName("二号窗口");

thread_1.start();

Thread thread_2=new Thread(ticket);

ticket.setName("三号窗口");

thread_2.start();

Thread thread_3=new Thread(ticket);

ticket.setName("四号窗口"); //为什么前面的set那么没用呢?

thread_3.start();

Thread thread_4=new Thread(ticket);

thread_4.start();

}

}

java多线程卖票的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java多线程售票、java多线程卖票的信息别忘了在本站进行查找喔。