gpt4 book ai didi

java - 多线程机制?

转载 作者:行者123 更新时间:2023-12-01 12:10:24 25 4
gpt4 key购买 nike

我一直在尝试多线程,但我对我所做的测试感到非常困惑。我一直在做研究,一切都在讨论多线程如何允许两个进程同时运行。

我编写了这个程序,以便 3 个不同的线程使用 for 循环来计算 1-10、11-20 和 21-30,以便我可以查看它们是否实际上按照我的预期同时运行。

运行程序后,输出类似于 1 2 3 4 5 6 7 8 9 10 21 22 23 24 25 26 27 28 29 30 11 12 13 14 15 16 17 18 19 20基本上这 3 组数字的任何变化顺序。所以他们都可以是有序的,或者有时在 11-20 之前就已经有 21-30 了。这看起来不像是同时运行,只是一个接一个地运行。

在for循环中的println(i);如果我将其更改为 println(i + "a");对于 1-10 和 b, c 对于 11-20, 21-30 输出实际上是按照我预期的随机顺序。像这样:1a 11b 21c 2a 22c 12b 13b 23c 3a

程序是否知道它除了计数之外什么也没做,只是将所有数字扔到屏幕上而不实际执行?或者在末尾添加字符串是否会使其他线程在操作之间潜入的速度足够慢?我对此一无所知哈哈。

public class Run{

static Runnable updatePosition;
static Runnable render;
static Runnable checkCollisions;

public static void main(String[] args) {
// System.out.println(Runtime.getRuntime().availableProcessors());

updatePosition = new Runnable() {

@Override
public void run() {

for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
}

};

render = new Runnable() {

@Override
public void run() {
for (int i = 11; i <= 20; i++) {
System.out.println(i);
}

}

};

checkCollisions = new Runnable() {

@Override
public void run() {
for (int i = 21; i <= 30; i++) {
System.out.println(i);
}

}

};

Thread updatePositionThread = new Thread(updatePosition);
Thread renderThread = new Thread(render);
Thread checkCollisionsThread = new Thread(checkCollisions);
updatePositionThread.start();
renderThread.start();
checkCollisionsThread.start();

}

}

此外,线程如何分配给 CPU 核心?请深入、合理。我问这个问题的意思是:如果我要使用单线程程序并使用更新方法和绘制方法,它们一起花费太长时间并使我的程序滞后,将它们放在单独的线程上会使这没有帮助,或者它实际上不是并排运行的吗?假设我可以处理所有并发。

最佳答案

实际上,JIT 优化、处理器架构和其他几个因素都会影响这种情况的结果。

实际输出不应该是线程的有序执行,例如 1-10、21-30、11-20。

将代码稍微更改为:

for (int i = 1; i <= 10000; i++)
for (int i = 10001; i <= 20000; i++)
for (int i = 20001; i <= 30000; i++)

我明白了(正如预期的那样,一个线程的完整执行没有发生,正如您可能假设的那样)。这完全取决于线程获得多少时间。

1
2
3
...
250
251
252
253
20001
20002
20003
...
20127
20128
10001
10002
10003
..

i 更改为 "a"+ i 会导致使用 StringBuilder 动态构造新字符串,这确实需要一些时间(因此也需要 CPU 周期)。另一方面,原始整数没有这种延迟。所以,你会得到这样的输出。

关于java - 多线程机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27311963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com