//这是段问题代码,谁来告诉我它的问题何在?///////////////////////////////////////////
//编译方法:javac [filename].java
//编译结果:当前目录下生成两个文件:test.class , test$computer.class .
//运行方法:java testimport java.io.*;public class test{
int val = 0; class computer extends Thread //计算器对象
{
int n; public computer(int a)
{
n = a;
}
public void run()
{
int i = n * n; //这个是计算任务 try
{
Thread.sleep(3000);    //这个计算任务相当耗时。并有可能意外中断于是需要捕捉意外
}
catch (InterruptedException ex) { } synchronized (test.class) //提交计算结果时需要互斥访问。
{
val += i;
}
synchronized (this)
{
this.notify(); //发出工作结束的通知
}
}
}; computer c1, c2; //定义两个计算器
Thread t1, t2; //定义两个线程 public void init()
{
c1 = new computer(5);
c2 = new computer(8); //创建计算器,同时给定计算任务
t1 = new Thread(c1);
t2 = new Thread(c2); //创建线程,每个线程运行一个计算器 t1.start();
t2.start(); //启动线程进行计算
try
{
synchronized (this.t1)
{
t1.wait(); //等待线程t1计算结束
}
synchronized (this.t2)
{
t2.wait(); //等待线程t2计算结束
}
}
catch (InterruptedException ex) { } System.out.println("经过两个线程艰辛计算,最终结果是: " + val); //打印计算结果
} public static void main(String[] args)
{
test obj = new test();
obj.init();
}
}

解决方案 »

  1.   

    问题在于:
    format 不是很清楚。
      

  2.   

    如果要等待线程1和线程2运行结束,应该用
    try{
    t1.join();
    t2.join();
    }
    catch (InterruptedException e){
    e.printStackTrace();
    }你上面的写法会导致死锁。
      

  3.   

    说死锁不太正确,应该是这样的:
    在主线程在t1上等待时,可能t2已经执行完了,因此当主线程继续执行,在t2上等待时,就不会被notify,会一直等待下去。将例子中的t2.wait(); 改成 t2.wait(4000);,也可以执行。
      

  4.   

    同意afragtry
    {
    Thread.sleep(n*500); //这个计算任务相当耗时。并有可能意外中断于是需要捕捉意外
    }c1 = new computer(8);
    c2 = new computer(5); //创建计算器,同时给定计算任务可验证