我一直在尝试多线程,我真的很困惑我做过的测试。 我一直在做研究,一切都在谈论多线程如何允许两个进程同时运行。
我制作了这个程序,所以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。这似乎不是在同一时间运行,只是一个接一个地运行。
在println(i)的for循环中;如果我把它改成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内核?请合理地深入了解。我的意思是:如果我使用单个线程程序并使用更新方法和绘制方法,它们一起花了太长时间并使我的程序滞后,将它们放在单独的线程上使得这没有帮助,或者它实际上并不是并排运行吗?假设我可以处理所有的并发性。
答案 0 :(得分:1)
实际上,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周期)。另一方面,原始整数没有延迟 ..所以,你得到这样的输出。