首先线程public class TestThread11 {
private static Object lock = new Object();
public void execute(){ // synchronized修饰
synchronized(lock){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
if(i == 5){
try {
lock.wait();
System.out.println(Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notify();
}
}
}
}再来class ThreadAA implements Runnable {
public void run() {
TestThread11 test = new TestThread11();
test.execute();
}
public static void main(String[] args)
{
Runnable runabble=new ThreadAA();
Thread a=new Thread(runabble,"A");
a.start();
Thread b=new Thread(runabble,"B");
b.start();
Thread c=new Thread(runabble,"C");
c.start();
}
} 2个线程的时候 还好说一个线程肯定会调用notify,另外一个线程的肯定会被唤醒。
但是如果3个以上的线程时,就有可能线程A 调用wait后,线程B调用notify,然后wait释放锁后,线程A继续运行完,然后会notify线程B继续运行完,在这过程,线程C可能一直都不会运行,但是线程A,B都运行完了,线程Cwait后 就没有线程来唤醒它了,导致死锁。这问题怎么解决?
private static Object lock = new Object();
public void execute(){ // synchronized修饰
synchronized(lock){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
if(i == 5){
try {
lock.wait();
System.out.println(Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notify();
}
}
}
}再来class ThreadAA implements Runnable {
public void run() {
TestThread11 test = new TestThread11();
test.execute();
}
public static void main(String[] args)
{
Runnable runabble=new ThreadAA();
Thread a=new Thread(runabble,"A");
a.start();
Thread b=new Thread(runabble,"B");
b.start();
Thread c=new Thread(runabble,"C");
c.start();
}
} 2个线程的时候 还好说一个线程肯定会调用notify,另外一个线程的肯定会被唤醒。
但是如果3个以上的线程时,就有可能线程A 调用wait后,线程B调用notify,然后wait释放锁后,线程A继续运行完,然后会notify线程B继续运行完,在这过程,线程C可能一直都不会运行,但是线程A,B都运行完了,线程Cwait后 就没有线程来唤醒它了,导致死锁。这问题怎么解决?
解决方案 »
- java聊天室求助
- 关于HashMap的一个问题
- 问一个问题,我有一个byte数组,我要将它转成字符串,我如何控制,才能不让它在最后一位产生乱码
- 哪位大侠帮帮我吧!急 急 急
- 高分 求解析 XML字符串的方法,解决即结贴
- JAVA的前途!!!
- InputStream的一个重要方面理解问题?
- 请问怎样获得这样格式(2004:10:10)的一个日期对象
- 调用Process ps=Runtime.getRuntime().exec(cmd1,null,file)出错,急,请高手解决,谢谢了
- 怎样实现动态装载菜单的功能?谢谢
- java如何随机产生a-z之间的字母
- java swing 重合了,一个是登录页面跳转到另一个中是显示表格的,但是发现这两个界面重合了
不过可以帮你降低出现死锁的概率,将lock.notify();更改为lock.notifyAll();