public class Computation extends Thread {
private int num;
private boolean isComplete;
private int result;
public Computation(int num) {
this.num = num;
}
public synchronized void run() {
result = num * 2;
isComplete = true;
notify();
}
public synchronized int getResult() {
while (!isComplete) {
try {
wait();
} catch (InterruptedException e) {
}
}
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() + " ");
}
}
对这个问题,我有以下2个疑惑:
1.这个程序有必要加synchronized给 getResult()和run()方法吗?建立四个线程,我认为这四个线程是彼此独立的线程,根本不会存在有并发的情况。我试着把synchronized关键字和notify和 wait方法去掉之后,结果输出的结果跟之前的一模一样。
2.为什么这个题目的输出顺序,一直是0 2 4 6,并且顺序一直不会改变。按理说,四个线程创建后,进入就训状态,被CPU分配时间片也是随机的(我在run()方法里做了测试,是这样的)。那么输出的顺序也该是随机的。到底这程序哪个地方保证了它按顺序输出呢?多线程并发 同步同步
private int num;
private boolean isComplete;
private int result;
public Computation(int num) {
this.num = num;
}
public synchronized void run() {
result = num * 2;
isComplete = true;
notify();
}
public synchronized int getResult() {
while (!isComplete) {
try {
wait();
} catch (InterruptedException e) {
}
}
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() + " ");
}
}
对这个问题,我有以下2个疑惑:
1.这个程序有必要加synchronized给 getResult()和run()方法吗?建立四个线程,我认为这四个线程是彼此独立的线程,根本不会存在有并发的情况。我试着把synchronized关键字和notify和 wait方法去掉之后,结果输出的结果跟之前的一模一样。
2.为什么这个题目的输出顺序,一直是0 2 4 6,并且顺序一直不会改变。按理说,四个线程创建后,进入就训状态,被CPU分配时间片也是随机的(我在run()方法里做了测试,是这样的)。那么输出的顺序也该是随机的。到底这程序哪个地方保证了它按顺序输出呢?多线程并发 同步同步
解决方案 »
- 有问题的话,有没有较快捷的途径询问呢,难道要一个个发帖吗?
- Factory出来的,与普通new出来,为什么更好?
- 报错!帮看看!!
- 关于JDBC的工作原理?
- 散分抱怨!我以后再也不用Swing写程序啦!!
- javax.ejb怎么找不着?
- java 通过socket做为服务器段 与 delphi写的可户段 通讯的问题
- 需要一个记事本式的程序的源程序
- 在<textarea>中输入的字符串 getString 是有换行符的,但用sendmail发送这个getString 后,在邮件中显示的这个字符串里的所有换行符全不
- 我写了一个bean,怎么在另一个java中调用他?
- java applet 在页面显示被安全阻止,
- 有关ssl的问题,我已经有证书了,如何用Java模拟ssl通信
实际中加锁的只是对数据进行修改的方法需要加锁。
另外楼主是new了很多对象来进行线程,这样每个线程都有自己的一个对象。
我猜楼主其实想要的结果是一个对象的四个线程,这才对。
改成 computations = new Computation(i);
computations.start();
computations.start();
computations.start();
看效果
你又是按照万能遍历数组 来运行这个数组中对象的方法 这个其实和线程已经没有什么关系
完全可以看成是在操作普通对象。
要看结果 你在run()
中调用getResult结果,而不是去循环调用对像中的方法 这就有点像调用直接调用run()方法一样 没有线程并发的操作的现象。。
意思是四个线程的run方法执行顺序无所谓。主要就是最后的那个输出上面。
呵呵,谢谢你的耐心解答!
你给程序也确实也保证一个对象四个线程。
这实际是一道考题,考题就这样的。在实际中,确实也没有对run()方法加过锁。
2.线程运行顺序是不确定的,但输出结果是确定的。就是*2,参数是你循环时确定的。