切符を買うプログラムのデッドロックの発生は解決します
3368 ワード
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();
}
}