//这是段问题代码,谁来告诉我它的问题何在?///////////////////////////////////////////
//编译方法: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();
}
}
//编译方法: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();
}
}
解决方案 »
- java中title正则表达式,这个错在哪里在,怎么用正则表达式提取弹性体文档中<title></title>之间的文字
- 为何我的快速排序如此龟速?
- 谁能帮忙分析一下这段代码
- 我写了一个wf聊天,可是不知道哪里错了,请高手指点。。。
- 关于一个Frame的奇怪问题
- 小问题
- 如何在不同的class实现监听
- 如何在Applet中连接另一个Web页?
- 限制用户连接的问题?
- 大家评论一下这两本书:《java入门经典》、《java完全探索》好吗?我正在看《核心技术卷I》,怎么觉得写的很零碎呀??请看过这些数的兄弟多多指点一下,小弟多谢了!!? //bow bow
- 在java1.5中怎么生成这样的时区列表啊?急急急....在线等
- java实现保存、打开功能
format 不是很清楚。
try{
t1.join();
t2.join();
}
catch (InterruptedException e){
e.printStackTrace();
}你上面的写法会导致死锁。
在主线程在t1上等待时,可能t2已经执行完了,因此当主线程继续执行,在t2上等待时,就不会被notify,会一直等待下去。将例子中的t2.wait(); 改成 t2.wait(4000);,也可以执行。
{
Thread.sleep(n*500); //这个计算任务相当耗时。并有可能意外中断于是需要捕捉意外
}c1 = new computer(8);
c2 = new computer(5); //创建计算器,同时给定计算任务可验证