下面是我对多线程的一个测试:
public class MultiThread
{
public static void main(String [] args)
{
MyThread mt=new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
class MyThread implements Runnable{
int index;
int i;
public void run()
{
while(i<20)
{
System.out.println(Thread.currentThread().getName()+":"+index++);
i++;
}
}}
运行结果是:Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-1:8
Thread-2:9
Thread-3:10
Thread-1:11
Thread-2:12
Thread-3:13
Thread-1:14
Thread-2:15
Thread-3:16
Thread-1:17
Thread-2:18
Thread-3:19
Thread-1:20
Thread-2:21
Thread-3:22我就不明白,为什么打印出的值是连续的?我试过,换成普通的类(非线程类),就没这种情况,还有就是怎么会打印到22呢?
请斑竹和各位高手指点。
public class MultiThread
{
public static void main(String [] args)
{
MyThread mt=new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
class MyThread implements Runnable{
int index;
int i;
public void run()
{
while(i<20)
{
System.out.println(Thread.currentThread().getName()+":"+index++);
i++;
}
}}
运行结果是:Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-1:8
Thread-2:9
Thread-3:10
Thread-1:11
Thread-2:12
Thread-3:13
Thread-1:14
Thread-2:15
Thread-3:16
Thread-1:17
Thread-2:18
Thread-3:19
Thread-1:20
Thread-2:21
Thread-3:22我就不明白,为什么打印出的值是连续的?我试过,换成普通的类(非线程类),就没这种情况,还有就是怎么会打印到22呢?
请斑竹和各位高手指点。
int i=0;
public void run()
{
while(i<20)
{
System.out.println(Thread.currentThread().getName()+":"+i);
i++;
}
}
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-1:7
Thread-2:7
Thread-这后面的数才是你的线成名,是随即的,后面的数是你的I的值
{
public static void main(String [] args)
{
MyThread mt=new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
class MyThread implements Runnable{
int index;
int i;
String k = "";
public void run()
{
while(i<20)
{
k = Thread.currentThread().getName() + ":" +i;
System.out.println(k);
i++;
}
System.out.println("finally i is : " + i);
}}你从这个就可以看出实际的结果了。
另外,我觉得如果将代码写开些,比如:
System.out.println(Thread.currentThread().getName()+":"+index++);
写成
k = Thread.currentThread().getName() + ":" +i;
System.out.println(k);
i++;
线程分散的效果更好,(这个是我个人的感觉),不知道大家对此有没有什么想法?
Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-1:8
Thread-2:9
Thread-3:10
Thread-1:11
Thread-2:12
Thread-3:13
Thread-1:14
Thread-2:15
Thread-3:16
Thread-1:17
Thread-2:18
Thread-3:19
Thread-1:20而不是每个线程打一次0-20....因为每个线程都调用同一个对象中的属性代码验证中...
public class MultiThread
{
public static void main(String[] args)
{ MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
MyThread mt3 = new MyThread();
MyThread mt4 = new MyThread();
new Thread(mt1).start();
new Thread(mt2).start();
new Thread(mt3).start();
new Thread(mt4).start();
}
}
(1) 我的初衷是想知道为什么用Runnable接口实现的线程能访问同一资源.这一点上有的朋友理解上有偏差,我觉得foxty(狐狸糊涂)说得较为清楚和合理一些.
(2) 我试过同步,确实可行.至于为什么能打印到22,我的理解是,可能当有一个或几个线程进入循环后,它们运行的时间片到了,等到再轮到是index可能等于20了,再运行程序index的值就是22了.
这是我个人的一点看法,如果大家还有更好的解释,请不要吝啬,贴出来交流一下.
出现大于20是因为System.out.println(Thread.currentThread().getName()+":"+index++);
i++;这两句中间发生线程切换,即同步问题。
至于连续打印的问题,我认为Java多线程中每行代码作为原语处理,执行当中不允许线程切换,导致index每次加一后立即打印出来。
有不对的请指教!