当前位置 : 主页 > 编程语言 > java >

多线程死锁现象测试

来源:互联网 收集:自由互联 发布时间:2021-06-28
DeadLock.java package Thread;class A{ public synchronized void foo(B b) { System.out.println("当前线程名: "+ Thread.currentThread().getName()+"进入了A实例的foo()方法"); try { Thread.sleep(200); } catch (InterruptedException ex)
DeadLock.java
package Thread;

class A
{
    public synchronized void foo(B b)
    {
        System.out.println("当前线程名: "+ Thread.currentThread().getName()+"进入了A实例的foo()方法");
        try {
            Thread.sleep(200);
        }
        catch (InterruptedException ex)
        {
            ex.printStackTrace();
        }
        System.out.println("当前线程名: "+Thread.currentThread().getName()+" 企图调用B实例的last()方法");
        b.last();
    }
    public synchronized void last()
    {
        System.out.println("进入了A类的last()方法内部");
    }
}

class B
{
    public synchronized void bar(A a)
    {
        System.out.println("当前线程名: "+ Thread.currentThread().getName()+"进入了B实例的bar()方法");
        try {
            Thread.sleep(200);
        }
        catch (InterruptedException ex)
        {
            ex.printStackTrace();
        }
        System.out.println("当前线程名: "+Thread.currentThread().getName()+" 企图调用A实例的last()方法");
        a.last();
    }
    public synchronized void last()
    {
        System.out.println("进入了B类的last()方法内部");
    }
}

public class DeadLock implements Runnable{
    A a = new A();
    B b = new B();
    public void init()
    {
        Thread.currentThread().setName("主线程");
        //调用a对象的foo()方法
        a.foo(b);
        System.out.println("进入主线程之后");
    }
    public void run()
    {
        Thread.currentThread().setName("副线程");
        //调用b对象的bar()方法
        b.bar(a);
        System.out.println("进入副线程之后");
    }

    public static void main(String[] args) {
        DeadLock dl = new DeadLock();
        //以dl为target启动新线程
        new Thread(dl).start();
        dl.init();
    }
}
网友评论