建议我任何实时情况,我应该创建多个线程,然后引入死锁情况。这是一个项目!你可以帮助在一些实时情况下使应用程序更有趣吗
答案 0 :(得分:5)
答案 1 :(得分:2)
这会导致死锁:
public static void main(String[] args)
{
final Object object1 = new Object();
final Object object2 = new Object();
Thread thread1 = new Thread(
new Runnable()
{
public void run()
{
try
{
//**** Lock on object1 first ****
synchronized(object1)
{
Thread.sleep(1000);
//**** Lock on object2 second ****
synchronized(object2)
{
System.out.println("Should never get here.");
}
}
}
catch (InterruptedException e)
{
System.out.println("Thread interupted.");
}
}
}
);
Thread thread2 = new Thread(
new Runnable()
{
public void run()
{
try
{
//**** Lock on object2 first ****
synchronized(object2)
{
Thread.sleep(1000);
//**** Lock on object1 second ****
synchronized(object1)
{
System.out.println("Should never get here.");
}
}
}
catch (InterruptedException e)
{
System.out.println("Thread interupted.");
}
}
}
);
thread1.start();
thread2.start();
}
基本上你有2个线程在同一个对象上竞争锁。线程1在object1
上获得锁定,而线程2在object2
上获得锁定,然后每个线程都试图锁定另一个对象,并且因为另一个线程已经拥有锁定而导致死锁。
答案 2 :(得分:0)
您可以使用producer-consumer算法来演示多线程。
报告生成器 方案是,每个报告的数据被插入队列中以供一个服务(生产者)进一步处理。报表处理器服务(使用者)从队列中获取报告的数据,并一次处理一个报告。报告处理器服务可以有5种不同的实例。所有这些都使用单个队列中的报告(这可能是您需要在队列中引入锁定等)。
答案 3 :(得分:0)
您还可以使用固定大小的线程池进行死锁:
final ExecutorService exec = Executors.newFixedThreadPool(1);
exec.submit(new Runnable() {
public void run() {
Future<?> f = exec.submit(new Runnable() {
public void run() {
}
});
try { f.get(); } catch (Exception ex) { }
}
});