人到中年,职业危机,不得已开始补习java基础知识。
原本雄心壮志觉得多线程这部分一周就差不多了,结果写了个例子就想不明白了,今天贴出来大家给指点指点吧。
随后我会把多线程的相关知识从浅入深的写写,如有错误,请多多包涵。
public class ThreadStudy {
public static class ShareBean {
private int abc;
public int getAbc() {
return abc;
}
public void addOne() {
String threadName = Thread.currentThread().getName();
System.out.println("当前线程《" + threadName +"》加一开始:" +abc);
abc =abc +1;
System.out.println("当前线程《" + threadName +"》加一结束:" +abc);
}
}
public static void main(String[] args)throws InterruptedException {
ShareBean shareBean =new ShareBean();
Runnable runnable1 =new Runnable() {
@Override
public void run() {
shareBean.addOne();
}
};
Runnable runnable2 =new Runnable() {
@Override
public void run() {
shareBean.addOne();
}
};
for(int i=0;i<10;i++) {
Thread t1 =new Thread(runnable1);
t1.setName("a" + i);
t1.start();
Thread t2 =new Thread(runnable2);
t2.setName("b" + i);
t2.start();
}
Thread.sleep(3000);
System.out.println("多线程情况结果:" + shareBean.getAbc());
}
}
下面是一次运行的结果:
当前线程《a0》加一开始:0
当前线程《a0》加一结束:1
当前线程《b1》加一开始:0
当前线程《b1》加一结束:2
当前线程《a2》加一开始:0
当前线程《b0》加一开始:0
当前线程《a1》加一开始:0
当前线程《a1》加一结束:5
当前线程《b0》加一结束:4
当前线程《a2》加一结束:3
当前线程《b2》加一开始:2
当前线程《a3》加一开始:1
当前线程《a3》加一结束:7
当前线程《b2》加一结束:6
当前线程《a5》加一开始:5
当前线程《a5》加一结束:8
当前线程《a4》加一开始:7
当前线程《a4》加一结束:9
当前线程《b4》加一开始:9
当前线程《b4》加一结束:10
当前线程《a8》加一开始:10
当前线程《a8》加一结束:11
当前线程《b3》加一开始:11
当前线程《b3》加一结束:12
当前线程《a9》加一开始:11
当前线程《b9》加一开始:12
当前线程《b9》加一结束:14
当前线程《a6》加一开始:12
当前线程《a7》加一开始:14
当前线程《a7》加一结束:16
当前线程《b8》加一开始:13
当前线程《b8》加一结束:17
当前线程《a9》加一结束:13
当前线程《b5》加一开始:17
当前线程《b6》加一开始:16
当前线程《b6》加一结束:19
当前线程《b7》加一开始:16
当前线程《a6》加一结束:15
当前线程《b7》加一结束:20
当前线程《b5》加一结束:18
多线程情况结果:20
我这里有两个问题:
- 按以上运行结果理解,b5线程最后运行结束,按说abc的最终结果应该是20。
- b7加一开始时值为16,结束时值为20,中间值不存在,怎么造成的。
我是灰灰
网友评论