首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程力学?

多线程力学?
EN

Stack Overflow用户
提问于 2014-12-05 08:46:39
回答 1查看 94关注 0票数 0

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

我制作这个程序是为了让3个不同的线程使用for循环来计数1-10、11-20和21-30,这样我就可以看到它们是否真的按照我预期的方式运行了。

运行程序后,输出基本上是3组数字的任意变化顺序,如1、2、3、4、5、6、7、8、9、21、22、23、24、26、27、29、29、11、13、14、15、17、18、19、20等。所以他们都可以在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

这个程序知道它除了数数之外什么也不做,只是把所有的数字都扔到屏幕上,而不去做呢?还是在最后添加字符串会使其他线程在操作之间溜进来的速度足够慢?我对这件事一无所知。

代码语言:javascript
复制
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内核的?请深入,合理。我问这个问题的意思是:如果我使用一个线程程序,使用一个更新方法和一个绘图方法,它们在一起花费的时间太长,使我的程序滞后,会不会把它们放在单独的线程上,这样做没有帮助,还是它不是同时运行的呢?假设我能处理所有的并发。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-05 09:09:14

实际上,JIT优化、处理器体系结构和其他一些因素在这种情况的发生过程中起到了一定的作用。

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

将代码稍微更改为:

代码语言:javascript
复制
for (int i = 1; i <= 10000; i++)
for (int i = 10001; i <= 20000; i++)
for (int i = 20001; i <= 30000; i++)

我得到(正如预期的那样,一个线程的完整执行不会发生,就像在您的例子中可能假设的那样)。这完全取决于一个线程得到多少时间。

代码语言:javascript
复制
1
2
3
...
250
251
252
253
20001
20002
20003
...
20127
20128
10001
10002
10003
..

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27311963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档