大家来找碴
//这是段问题代码,谁来告诉我它的问题何在?
///////////////////////////////////////////
//编译方法: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); //创建计算器,同时给定计算任务
可验证