首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Eclipse开发 >

各位能不能帮忙看一上上面两种java程序有什么(有关线程)

2013-03-10 
各位能不能帮忙看一下下面两种java程序有什么(有关线程)把for放到synchronized (this) {}外和内有什么区别

各位能不能帮忙看一下下面两种java程序有什么(有关线程)
把for放到synchronized (this) {}外和内有什么区别啊~路过的大侠,求帮忙
第一种:



package com.lzw;

public class SynchronizedBlockDemo implements Runnable {
private int number=0;

@Override
public void run() {
// TODO 自动生成的方法存根
for(int i=0;i<5;i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
synchronized (this) {
System.out.println(Thread.currentThread().getName()+":"+number++);
};
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
SynchronizedBlockDemo run=new SynchronizedBlockDemo();
    Thread thread1=new Thread(run);
    Thread thread2=new Thread(run);
    thread1.start();
    thread2.start();
}

}
运行结果:
Thread-1:0
Thread-0:1
Thread-1:2
Thread-0:3
Thread-0:4
Thread-1:5
Thread-1:6
Thread-0:7
Thread-1:8
Thread-0:9


第二种:

package com.lzw;

public class SynchronizedBlockDemo implements Runnable {
private int number=0;

@Override
public void run() {
// TODO 自动生成的方法存根
synchronized (this) {
for(int i=0;i<5;i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+number++);
};
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
SynchronizedBlockDemo run=new SynchronizedBlockDemo();
    Thread thread1=new Thread(run);
    Thread thread2=new Thread(run);
    thread1.start();
    thread2.start();
}

}
运行结果:
Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-1:5
Thread-1:6
Thread-1:7
Thread-1:8
Thread-1:9
java thread
[解决办法]
单线程的时候你肯定看不到效果了。另外你可以把for的次数调的多一点,调上10W次看看。
多线程的时候效果就出来了。。
第一种for循环内,那么for循环的过程中其它的线程也可以运行该方法。。
第二种for循环外,那么for循环的过程中其它的线程就不可以运行该方法体。

[解决办法]
除了1楼说的外,个人认为:
代码实现的功能是把属性number递增,两端代码都能实现。第一种效率更高。
第2种的效率很差,它把sleep()也放在同步块里了。
如果没有sleep,差不多。
我测试了一下时间,第一种需要约500ms,而第二种要约1015ms.

热点排行