读书人

大家来找碴解决方案

发布时间: 2012-02-01 16:58:19 作者: rapoo

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

///////////////////////////////////////////
//编译方法: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); //创建计算器,同时给定计算任务

可验证

读书人网 >J2SE开发

热点推荐