日期:2014-05-20  浏览次数:20689 次

大家来找碴
//这是段问题代码,谁来告诉我它的问题何在?

///////////////////////////////////////////
//编译方法:javac   [filename].java
//编译结果:当前目录下生成两个文件:test.class   ,   test$computer.class   .
//运行方法:java   test

import   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和线程2运行结束,应该用
try{
t1.join();
t2.join();
}
catch (InterruptedException e){
e.printStackTrace();
}

你上面的写法会导致死锁。
------解决方案--------------------
同意afrag

try
{
Thread.sleep(n*500); //这个计算任务相当耗时。并有可能意外中断于是需要捕捉意外
}

c1 = new computer(8);
c2 = new computer(5); //创建计算器,同时给定计算任务

可验证