package tickets;
public class Tickets implements Runnable
{
static int tickets = 100;
Object o = new Object();
boolean isSell = false;
boolean ouse;//对象o锁定标志
boolean tuse;//对象this锁定标志
public void run()
{
// TODO Auto-generated method stub
if(!isSell)
{
while(true)
{
if(!ouse&&!tuse)
{
try
{
Thread.sleep(1);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
ouse = true;
tuse = true;
synchronized(o)
{
synchronized(this)
{
Thread.yield();
if(tickets>0)
{
try
{
Thread.sleep(1);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖出了第"+tickets+"张票");
tickets--;
}
else
{
break;
}
}
ouse = false;
tuse = false;
Thread.yield();
}
}
}
}
else
{
while(true)
{
if(!ouse&&!tuse)
{try
{
Thread.sleep(1);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
ouse = true;
tuse = true;
if(!sell())
{
break;
}
else
{
Thread.yield();
}
}
}
}
}
public synchronized boolean sell()
{
try
{
Thread.sleep(10);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o)
{
Thread.yield();
if(tickets>0)
{
try
{
Thread.sleep(10);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"用sell()卖出了第"+tickets+"张票");
tickets--;
ouse = false;
tuse = false;
return true;
}
else
{
ouse = false;
tuse = false;
return false;
}
}
}
}
package tickets;
public class TicketsTest
{
public static void main(String[] args)
{
Tickets t = new Tickets();
new Thread(t,"一号窗口").start();
try
{
Thread.sleep(1);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
t.isSell = true;
new Thread(t,"二号窗口").start();
// new Thread(t,"三号窗口").start();
// new Thread(t,"四号窗口").start();
}
}