java中进程怎么强制运行,还有死锁的解释

newThread(this).start();Thread.join();//Asus.java:22:无法从静态上下文中引用非静态方法join(long)Thread... new Thread(this).start();
Thread.join();//Asus.java:22: 无法从静态上下文中引用非静态 方法 join(long)
Thread.currentThread().join();//执行这个之后进程就没反映了
创建匿名对象时调用对象的的无参构造器
设置当前线程的线程名
创建并开启匿名线程(线程名为之前设置的);开启后该类中的run开始运行
运行A类中的funA同步方法(参数为类B) 运行B类中的funB同步方法(参数为类A)
声明字符串name=在此运行的线程名 声明字符串name=在此运行的线程名
输出线程名信息+进入 A.foo 输出线程名信息+Thread 进入 B 类中的
线程休眠1秒钟 线程休眠1秒钟
调用类B中的last同步方法 调用类A中的last同步方法
输出线程名信息+调用 B 类中的 last()方法 输出线程名信息+调用 A 类中的 last()方法
在进入last方法之时出现的死锁,为什么?虽然调用的是同步方法,但是调用的是两个不同的同步方法啊,希望高手解释清楚,谢谢
/*
程序运行流程,主程序main创建一个匿名对象DeadLockDemo
*/
class A
{
synchronized void funA(B b)
{
String name=Thread.currentThread().getName();
System.out.println(name+ " 进入 A.foo ");
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println(name+ " 调用 B 类中的 last()方法");
try
{
System.out.println(name+" 进行强制运行");
Thread.currentThread().join();
System.out.println(name+" 进行强制运行");
}
catch(Exception e)
{
System.out.println(name+" 出现异常"+e);
}
System.out.println(name+" 进行强制运行");
b.last();
System.out.println(name+ " B类中的last()方法调用完毕");
}
synchronized void last()
{
System.out.println("A 类中的 last()方法");
}
}
class B
{
synchronized void funB(A a)
{
String name=Thread.currentThread().getName();
System.out.println(name + " 进入 B 类中的");
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println(name + " 调用 A 类中的 last()方法");
a.last();
System.out.println(name + " A类中的last()方法调用完毕");
}
synchronized void last()
//void last()//采用这个也可解决死锁,但是会出现同步问题
{
System.out.println("B 类中的 last()方法");
}
}
class DeadLockDemo implements Runnable
{
A a=new A();
B b=new B();
DeadLockDemo()
{
// 设置当前线程的名称
//Thread.currentThread()可以获取当前线程的引用,一般都是在没有线程对象又需要获得线程信息时通过Thread.currentThread()获取当前代码段所在线程的引用。
Thread.currentThread().setName("Main -->> Thread");
new Thread(this).start();
// a.funA(b);
String name=Thread.currentThread().getName();
a.funA(new B());//采用这个也可解决死锁
System.out.println("main 线程运行完毕");
}
public void run()
{
Thread.currentThread().setName("Test -->> Thread");
// b.funB(a);
b.funB(new A());//采用这个也可解决死锁
System.out.println("其他线程运行完毕");
}
//main直接写在拥有多线程接口的类中也可分开,下面的main为写在独立的一个Asus类中,运行结果相同
/*
public static void main(String[] args)
{
new DeadLockDemo();
}
*/
}
public class Asus
{
public static void main(String[] args)
{
new DeadLockDemo();
}
}
展开
 我来答
gis19831203
2011-08-29 · TA获得超过690个赞
知道小有建树答主
回答量:914
采纳率:0%
帮助的人:837万
展开全部
看了你的程序,确实会出现死锁,因为:
1。funA中有需要等待当前线程结束(你的例子中就是主线程)再执行b.last(),此时主线程持有对象a的锁。
2。funB中需要调用a.last()时又需要得到对象a的锁(因为函数声明为synchronized),由于第一点,所以在funcA返回前得不到对象a的锁
3。而funcA要像返回,又必须要调用funcB的线程返回(显然不可能),
所以,你的两个线程死锁了。
对于你的注释中有几中情况下又不死锁了,是因为这样:
1.去掉synchronized关键字,这样last不是同步方法,调用它不需要获得锁,所以……(你知道的)
2.funcA(new B()),或funcB(new A()),实际上都已经新创建了对象了,所以连个线程等待的锁也就不一样了(等待的是不同A(或B)对象的锁),这样当然也不会死锁了。

另外:
//我不太明白你的“进行强制运行”是什么意思,join通常的讲就是等待线程结束后才返回,这应该是借用的LINUX系统的一个术语。
try
{
System.out.println(name+" 进行强制运行");
Thread.currentThread().join();
System.out.println(name+" 进行强制运行");
}
catch(Exception e)
{
System.out.println(name+" 出现异常"+e);
}
手机用户09689
2011-08-30
知道答主
回答量:3
采纳率:0%
帮助的人:5085
展开全部
这边有10年的网站制作与运营经验,联系电186加0592加3238,如果您需要看案例可搜"厦门一米设计".需要注意的是做网站不单是开发的问题更重要的是要解决如何来客户等实际运营问题,我们可以提供这方面的经验,您看一下我的腾迅微博@sbamdanb就知道我们的实力,我们有十五万的粉丝 ------------------------------后面这段内容无意义-py瘛ハんテЗby瘛ハんテЗc┮qt瞌t瞌nシy瘛ハんテЗpy瘛ハんテЗby瘛ハんテЗc┮qt瞌t瞌nシy瘛ハんテЗpy瘛ハんテЗby瘛ハんテЗc┮qt瞌t瞌nシy瘛ハんテЗpy瘛ハんテЗby瘛ハんテЗc┮qt瞌t瞌nシy瘛ハんテЗpy瘛ハんテЗby瘛ハんテЗc┮qt瞌t瞌nシy瘛ハんテЗ
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式