下面这个程序为什么会有 1 0 2 3 4 和 0 1 1 2 3 4 0 这样2个输出?
class test{
public static void main(String str[]){
useRunnable ur = new useRunnable();
Thread t = new Thread(ur);
t.start(); Thread t1 = new Thread(ur);
t1.start(); }
}
class useRunnable implements Runnable{
int i;
public void run(){
i = 0;
while(i<5){
System.out.print(i++);
} }
}
class test{
public static void main(String str[]){
useRunnable ur = new useRunnable();
Thread t = new Thread(ur);
t.start(); Thread t1 = new Thread(ur);
t1.start(); }
}
class useRunnable implements Runnable{
int i;
public void run(){
i = 0;
while(i<5){
System.out.print(i++);
} }
}
Thread t = new Thread(ur);
t.start(); Thread t1 = new Thread(ur);
t1.start();启动了2次输出0123401234
Thread t = new Thread(ur);
t.start(); Thread t1 = new Thread(ur);
t1.start();
一点拙见啊
大概是多线程同步问题
虽然你不是一起start()的
但是start不等于九run了
还是有可能有干扰的
而且 i++不是一个原子操作
应该用synchronized{this}块包起来
或者是把i++放到一个同步方法里
要达到0123401234这个效果必须要同步。如下:
synchronized(this){
i = 0;
while(i <5)
{
System.out.print(i++);
}
}
两个线程中调用的i,都是内存中的同一个位置.int i;
public void run(){
i = 0;
while(i <5){
System.out.print(i++);}}这是run方法的字节码,线程在下面每个基本操作时,都可能被中断
public void run();
Code:
Stack=5, Locals=1, Args_size=1
0: aload_0
1: iconst_0
2: putfield #2; //Field i:I
5: aload_0
6: getfield #2; //Field i:I
9: iconst_5
10: if_icmpge 33
13: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStrea
16: aload_0
17: dup
18: getfield #2; //Field i:I
21: dup_x1
22: iconst_1
23: iadd
24: putfield #2; //Field i:I
27: invokevirtual #4; //Method java/io/PrintStream.print:(I)V
30: goto 5
33: return
线程和你的操作系统还有硬件也是有一定关系的
对于时间片的分配
你可以在while前让它休眠一下sleep因该会有1 0 2 3 4