站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题sleep是线程类(Thread)的方法

sleep是线程类(Thread)的方法

摘要: sleep是线程类(Thread)的方法


class A
{
synchronized void foo(B b)
{
String name=Thread.currentThread().getName();
System.out.println(name+ " entered A.foo ");
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println(name+ " trying to call B.last()");
b.last();
}
synchronized void last()
{
System.out.println("inside A.last");
}
}
class B
{
synchronized void bar(A a)
{
String name=Thread.currentThread().getName();
System.out.println(name + " entered B.bar");
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println(name + " trying to call A.last()");
a.last();
}
synchronized void last()
{
System.out.println("inside A.last");
}
}
class Deadlock implements Runnable
{
A a=new A();
B b=new B();
Deadlock()
{
Thread.currentThread().setName("MainThread");
new Thread(this).start();
a.foo(b); //get lock on a in this thread.
System.out.println("back in main thread");
}
public void run()
{
Thread.currentThread().setName("RacingThread");
b.bar(a); //get lock on a in other thread.
System.out.println("back in other thread");
}
public static void main(String[] args)
{
new Deadlock();
}
}

大家帮忙,线程的代码我看不懂,感谢

为什么有死锁,感谢


Thread.sleep(1000);为什么加上这句是强制死锁条件的出现,感谢。我不懂,请教了。


顶。。。。。。。。。。


sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。Thread.sleep(1000);暂时停止1000毫秒


能不能根据程序讲一下为什么死锁,感谢


SLEEP的功能我知道


Java的,俺看不懂的~


明白了,感谢


1.synchorized保证同一时刻只有一个线程在运行;
2.由哪个线程执行了sleep,就由那个线程去睡觉,并把cpu的执行权释放,交给另外一个线程;
所以,当程序执行到b.last()的时候,当前线程需要进入另一个线程,当然就死锁了


加上thread.sleep是说明可能出现死锁,并不是说这就一定出现死锁。


回J_NeedForSpeed(旧欢如梦):

     Deadlock()
{
Thread.currentThread().setName("MainThread");
new Thread(this).start();
a.foo(b); //get lock on a in this thread.
System.out.println("back in main thread");
}
这里执行new Thread(this).start();启动新线程之后,新线程并不马上执行,有可能继续执行主线程的代码,为了在住线程结束前执行新线程,所以必须让主线程Thread.sleep(1000);以便新线程获得处理机.



其实如果你这个时间比较短的话,再计算机中不能吧这个时间分配给另一个synchorized线程的话,这个Sleep就没有作用了。不过这种可能性很小。一般的就是sleep以后这个thread停止了CPU的使用,把cpu分配给另一个与其synchorized的thread了而再统一时刻只允许一个线程执行,这样的话,就出现了死锁。其实如果把cpu不分配给另一个线程的话,这个中间还有别的线程,等别的线程结束后,那个sleep的线程结束了sleep,那这个死锁就不发生了。很理想的状态,可能只能从理论上去考虑吧。哈哈


主线程执行到a.foo(b)中的b.last()方法时,因为foo(b)方法是synchronized修饰的,所以把对象a的标志位置为0.
新线程执行到b.bar(a)中的a.last()方法时,因为bar(a)方法是synchronized修饰的,所以把对象b的标志位置为0.

这时
  主线程试图执行b.last(),因为b.last()方法是synchronized修饰的,而b的标志位为0,进不去
  新线程试图执行a.last(),因为a.last()方法是synchronized修饰的,而a的标志位为0,进不去

死锁就发生了.


↑返回目录
前一篇: http status 403-access to requested resource has been dennied
后一篇: System.out.println(sprinklers)输出toString()的返回字符串,没有人工赋值