关于Java中多线程的问题

32 ℉ 2019-10-14 01:08:59
如题:
main线程中的两个for方法,不知道main 的具体顺序,是第一个for 方法里面的线程全部创建完之后,才会执行到第二个for方法吗?
下面的foreach 语句又是怎么执行到的?main不是按顺序执行吗?懵逼了,不知道下面的代码具体的执行顺序

package multithreading;

public class TestThread {

public static void main(String[] args) {

final Hero666 gareen = new Hero666();
gareen.name = "盖伦";
gareen.hp = 10000;

System.out.printf("盖伦的初始血量是 %.0f%n", gareen.hp);

//多线程同步问题指的是多个线程同时修改一个数据的时候,导致的问题

//假设盖伦有10000滴血,并且在基地里,同时又被对方多个英雄攻击

//用JAVA代码来表示,就是有多个线程在减少盖伦的hp
//同时又有多个线程在恢复盖伦的hp

//n个线程增加盖伦的hp

Thread[] addThreads = new Thread[10000];
Thread[] reduceThreads = new Thread[10000];

for (int i = 0; i < 10000; i++) { //使用循环创建线程
Thread t = new Thread(){
public void run(){
gareen.recover();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
t.start(); //使用start()方法,不会阻塞
addThreads[i] = t;

}

//n个线程减少盖伦的hp
for (int i = 0; i < 10000; i++) {
Thread t = new Thread(){
public void run(){
gareen.hurt();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
t.start();
reduceThreads[i] = t;
}

//等待所有增加线程结束
for (Thread t : addThreads) {
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//等待所有减少线程结束
for (Thread t : reduceThreads) {
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

//代码执行到这里,所有增加和减少线程都结束了

//增加和减少线程的数量是一样的,每次都增加,减少1.
//那么所有线程都结束后,盖伦的hp应该还是初始值

//但是事实上观察到的是:

System.out.printf("%d个增加线程和%d个减少线程结束后%n盖伦的血量变成了 %.0f%n", 10000,10000,gareen.hp);

}
...全文
103 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ml_dark 2019-10-21
  • 打赏
  • 举报
回复
线程的执行取决于CPU,不是你代码的顺序,两个JOIN部分,估计代码还没有执行到哪个地方,线程都执行完了,要想获得预期效果,就在你盖伦血量控制的地方进行同步
kkkkk0lllll 2019-10-21
  • 打赏
  • 举报
回复
引用 2 楼 32 ℉ 的回复:
[quote=引用 1 楼 kkkkk0lllll的回复:]同一个线程的代码,是顺序执行
也就是说主线程的代码执行到第一个for,要将for执行完才会接着往下执行第二个for马[/quote] 对的,是这样的
qybao 2019-10-14
  • 打赏
  • 举报
回复
对于main线程来水,是第一个for执行完才会执行第二个for 对于第一个for的new线程来说,执行顺序是随机的,和main线程的顺序没关系,第二个for的new线程也一样 至于盖伦的血量为什么会和想象的结果不一样,首先因为上面说的new线程执行是随机的,其次是因为盖伦变量没有加锁同步,所以你后来的join,也许在join之前线程就执行结束了,所以盖伦的血量就是不可控
32 ℉ 2019-10-14
  • 打赏
  • 举报
回复
引用 1 楼 kkkkk0lllll的回复:
同一个线程的代码,是顺序执行
也就是说主线程的代码执行到第一个for,要将for执行完才会接着往下执行第二个for马
kkkkk0lllll 2019-10-14
  • 打赏
  • 举报
回复
同一个线程的代码,是顺序执行

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧