java多线程的卖票问题

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

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

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

publicclassThreadTest{
publicstaticObjectobj=newObject();
publicstaticintnumber=10;//用static共享票源,不知道可以不,按理说是可以的

/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
MyThreadmy=newMyThread();
MyThreadmy2=newMyThread();
Threadt1=newThread(my2,"2号窗口");
Threadt2=newThread(my,"1号窗口");
t1.start();
t2.start();
}

{

publicvoidrun(){
while(true)
synchronized(obj){
if(number>0){
System.out.println(Thread.currentThread().getName()
+"正在卖票,"+"还剩"+number+"张票");
number--;
obj.notifyAll();
try{
obj.wait();
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}

}else
break;
}

}
}
}

㈡ Java中卖票问题

Thread-0线程正在卖第100张票
Thread-1线程正在卖第100张票
Thread-1线程正在卖第98张票
Thread-1线程正在卖第97张票
Thread-1线程正在卖第96张票
Thread-1线程正在卖第95张票
Thread-1线程正在卖第94张票
Thread-1线程正在卖第93张票
Thread-0线程正在卖第99张票
看清楚就知道:首先:0和1都拿到了第100张,0打印出来了,--了,然后0就拿了第99张,之后0就挂起了,然后1打印出来了,--了,然后1就拿了第98张,到后面0就把上次拿到的99打印出来

你new出来的两个线程都有独立的内存空间,你那个静态的tickets变量,每个线程用都会先从A类那个内存空间那里拿过来放到各自的空间里。
如果加上一个锁块就不同了,它保证每次只有一个线程在拿tickets,每次只有一个线程在--;

㈢ 用JAVA编写一个售票系统

上面的几位说的对啊,5分就要一个小型的系统,而且还是JAVA写的,看来是想要B/S模式的了。

㈣ 用java模拟四个售票点,不重复的卖出100张票(票的编号为1--100),售完为止。

/**
* 请用线程来完成,规则为:售票点一和三,只能销售编号为奇数的票,如1,3,5,7.......;售票点二只能销售
* 编号为2的倍数的票,如2,4,8.......;售票点四,只能销售编号为4的倍数的票如4,8,12....
* */
package 多线程;

public class TicketTest {

public static void main(String[] args) {
Ticket3 t=new Ticket3();
new Thread(t,"售票点一").start();
new Thread(t,"售票点二").start();
new Thread(t,"售票点三").start();
new Thread(t,"售票点四").start();

}
}
class Ticket3 implements Runnable
{
private int ticket=100;//共享数据
public void run()
{
while(true)//每个窗口都一致循环卖票,直到ticket为0,便结束循环
{
synchronized(Ticket.class)//每个线程进来都先判断锁,
{
if(ticket>0)
{
if(Thread.currentThread().getName().equals("售票点一")||Thread.currentThread().getName().equals("售票点三"))
{
if(ticket%2!=0)
{
System.out.println(Thread.currentThread().getName()+":卖出"+ticket+"号票");
ticket--;
}
else
{
continue;
}
}
else
{
if(ticket%2==0)
{
System.out.println(Thread.currentThread().getName()+":卖出"+ticket+"号票");
ticket--;
}
else
{
continue;
}
}
}
}
if(ticket==0)//每个线程都在卖掉一张票后判断是否还有票,没有就结束循环,run方法结束
return;
}
}
}

㈤ java编写的火车票卖票程序,用synchronized解决了一张票被卖多次问题,可又发现每次10

让每个线程只能买一张,买了就解锁,然后回到线程池里面等下一次抢到机会。

㈥ JAVA火车票售票系统

这个需要多线程的。网上简单的教程很多的。一般老师都拿这个来举例子。

㈦ java三个线程卖票问题

很简单 线程1 运行了 sellTicket,还没打印的时候 ,线程二又运行了sellTicket。两者打印的时候结果就是相同的。
解决办法。sellTicket时添加返回值。打印的时候把返回值打出来就好了。

㈧ java如何写火车站售票系统窗口

很简单 我给你个我写的程序,你可以参考一下 不懂的问我。

public class Shoupiao {

public static void main(String[] args) {
chushou c1=new chushou("A地火车站",10);
c1.start();//调用Thread中的run方法需要用start();
chushou c2=new chushou("B地火车站",5);
c2.start();
chushou c3=new chushou("C地火车站",8);
c3.start();
try {
c1.join(); //执行完 c1 c2 c3 在继续执行 目的让结束最后输出
c2.join();
c3.join();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("结束");
}
}
//新建一个类
class chushou extends Thread{//用继承Thread的方法来实现多线程
String iname;
public void run() {
for(int i=inumber;i>0;i--){
System.out.println(iname+"火车票卖出一张"+"剩余"+(i-1)+"张");
try {
Thread.sleep(100);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
int inumber;
public String getIname() {
return iname;
}
public void setIname(String iname) {
this.iname = iname;
}
public int getInumber() {
return inumber;
}
public void setInumber(int inumber) {
this.inumber = inumber;
}
public chushou(String iname, int inumber) {
this.iname = iname;
this.inumber = inumber;
}
}

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

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

publicclassTest{
publicstaticvoidmain(String[]args){

for(inti=0;i<3;i++){
newThread("线程"+i){
publicvoidrun(){
while(true){
intp=getNumber();
if(p>0){
System.out.println(getName()+"票号:"+p);
}else{
System.out.println("没票了");
break;
}
}
};
}.start();
}
}




publicstaticintnum=100; //总票数

/**
*synchronized同步锁
*@return
*/
(){
if(num>0){
returnnum--; //如果大于0,则返回当前票并减少一张
}
return0;
}
}

㈩ java用了sychoronized多线程 卖票问题 卖出了两个第一张票

这里的synchronized (aa)直接改为synchronized (“1”); 实例变量String aa = new String("1");可以去掉了,你在下面启用线程的时候是两个对象,不是同一个对象,严格来说已经没意义了,只是你的ticket 变量是static,因此是两个实例共享的变量,这种东西正确的做法是ticket 声明为实例变量,
Xc88 xcaa = new Xc88();
Thread bb = new Thread(xcaa);
bb.start();
Thread cc = new Thread(xcaa );
cc.start();
这也是两个线程,用一个资源,而且这样可以直接使用同步方法,不用同步块,另外提示,类名和变量名还有方法名取点有意义名字。