public class SecondThread implements Runnable{
int i;
@Override
public void run() {
for(;i<200;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
public static void main(String[] args) {
for(int i=0;i<30;i++){
//System.out.println(Thread.currentThread().getName()+" "+i);
if(i==20){
SecondThread st=new SecondThread();
new Thread(st,"新线程1").start();
new Thread(st,"新线程2").start();
}
}
}
}说实现了Runnable接口方式创建的多个线程可以共享线程类的实例属性,上面的代码,我运行了好几遍发现,线程1和线程2都有可能出现相同的i值,既然是共享实例属性,那应该是2个线程共享st的i值,既然都是用的同一个对象的i值,为什么还出现相同的i值呢?那不是与“实现了Runnable接口方式创建的多个线程可以共享线程类的实例属性”这句话矛盾了?求师傅帮忙解惑一下,我晕了一下午了这个点
int i;
@Override
public void run() {
for(;i<200;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
public static void main(String[] args) {
for(int i=0;i<30;i++){
//System.out.println(Thread.currentThread().getName()+" "+i);
if(i==20){
SecondThread st=new SecondThread();
new Thread(st,"新线程1").start();
new Thread(st,"新线程2").start();
}
}
}
}说实现了Runnable接口方式创建的多个线程可以共享线程类的实例属性,上面的代码,我运行了好几遍发现,线程1和线程2都有可能出现相同的i值,既然是共享实例属性,那应该是2个线程共享st的i值,既然都是用的同一个对象的i值,为什么还出现相同的i值呢?那不是与“实现了Runnable接口方式创建的多个线程可以共享线程类的实例属性”这句话矛盾了?求师傅帮忙解惑一下,我晕了一下午了这个点
解决方案 »
- Java 怎么做点按钮后画图?
- JAVA播放器
- 如何通个一个菜单来访问本地组件???急!!!
- 问个final方法的问题
- 在applet中,能不能根据byte[] 创建一个Image图像,并显示???如果可以,如何做?
- 登陆时候除了填写姓名,密码,还有那个检验码有什么用?
- Java能不能实现位域?就是C中的冒号:
- 各位好心人 帮一下我
- java线程中如何降低CPU的占用率?我这几个线程会不会死锁?
- java 里有没有可以查找文件的类
- 关于坦克大战中的线程运行的问题,我写了段小代码,为什么要用我注掉的绿色的部分,红色的部分为什么不可以呢
- java 中怎样对自带的List进行添加,删除,插入操作,不调用库函数自己写代码
T1:i++ // i为1
T2:i++ // i为2
T1:System.out.println(Thread.currentThread().getName()+" "+i); // 输出2
T2:System.out.println(Thread.currentThread().getName()+" "+i); // 输出2要么你就严格的做并发控制,比如:public void run() {
synchronized(this) {
for(;i<200;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}