package t055;
public class Computation extends Thread{
private int num;
private boolean isComplete;
private int result;
public Computation(int nu) {
num=nu;
} @Override
public synchronized void run() {
// TODO Auto-generated method stub
result=num*2;
isComplete=true;
notify();
}
public synchronized int getResult(){
while (!isComplete){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
public static void main(String[] args) {
Computation [] computations=new Computation[4];
for (int i = 0; i < computations.length; i++) {
computations[i]=new Computation(i);
computations[i].start();
}
for (Computation c :computations){
System.out.print(c.getResult()+",");
}
}
}A. The code will deadlock.
B. The code may run with no output.
C. An exception is thrown at runtime.
D. The code may run with output "0 6".
E. The code may run with output "2 0 6 4".
F. The code may run with output "0 2 4 6". Answer: F 我觉得E也有可能出现,大家说呢
for (Computation c :computations){
System.out.print(c.getResult()+",");
}
结果是按顺序打印的,前一个数值未打出来时,后面的语言暂时不会执行
private int num;
private boolean isComplete;
private int result; public Computation(int nu) {
num=nu;
} @Override
public synchronized void run() {
// TODO Auto-generated method stub
result=num*2;
isComplete=true;
try {
Thread.sleep(num);
} catch (InterruptedException e) {
e.printStackTrace();
}
notify();
} public synchronized int getResult(){
while (!isComplete){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} return result;
} public static void main(String[] args) {
Computation [] computations=new Computation[4];
// for (int i = 0; i < computations.length; i++) {
// computations[i]=new Computation(1000-i);
// computations[i].start();
// } computations[0]=new Computation(400);
computations[1]=new Computation(300);
computations[2]=new Computation(200);
computations[3]=new Computation(100); for (Computation c :computations){
System.out.print(c.getResult()+",");
}
}
}
System.out.print(c.getResult()+",");
}
的条件是线程执行完run方法,原因是对象的单一锁机制
另外这里是四个对象,所以每个对象之间不存在同步问题
所以现在流程是4个互不干扰的线程(这样说其实是错的,因为程序里涉及通知等待机制,但是这里不会带来同步问题),但只有第一个线程结束后,才会打印第一个c.getResult()(因为之前这个for each一直在阻塞),一次类推打印0246
这里的多线程容易被锁啊什么的误导!
这里其实就是做了一个异步处理的作用,所以在打印时,都不用关心哪个线程先执行,哪个后执行,只需要看主线程就可以了!主线程是顺序打印的各个执行结果,所以就是F,
换句话说
在for (Computation c :computations){
System.out.print(c.getResult()+",");
}
中c=computations[0]时,c.getResult()如果没有结果的话,循环不会往下执行,主线程是被拥塞的
哈哈 很猛的 theoffspring 例子都写到了 055.179 有点恐怖
是遍历数组吗 for (Computation c :computations){
System.out.print(c.getResult()+",");
}