微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用不同的线程时运行我们的源代码的顺序

如何解决使用不同的线程时运行我们的源代码的顺序

当我第一次开始学习 Java 时,我发现 code 是从 top 读到底部的。我想大家都理解,无需编写代码来覆盖该解释。

但是当我使用multi-threading时会发生什么?说我有一个简单的例子:

public class Tester {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 5; i++) {
            executorService.execute(new WorkingClass());
        }
        System.out.println("rest od code..");
        executorService.shutdown();
    }
}

class WorkingClass implements Runnable{
    @Override
    public void run() {
        System.out.println("working");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printstacktrace();
        }
    }
}

我正在使用singleThreadExecutor,因此 1个线程应该执行那些 5个任务。我期望我的 for循环将首先运行,至少打印一个"working",然后在控制台中打印"rest od code.."。我错了。我的结果总是这样:

rest od code..
working
working
working
working
working

有人可以告诉我在'working'之前至少没有一个'rest of code'打印在控制台上吗?代码是否有可能运行得如此之快,以致没有机会在到达(“其余代码”)之前实际运行任何run() method

[注意]希望您进行任何修改以改善此问题。

解决方法

不同的线程独立运行。无法保证您的主线程与其创建的任何“ Runnable”之间的相对顺序。

这与是否从上至下“读取”代码无关。这不是执行的有用概念。这是从上到下执行的一个简单的非线程示例:

   void method1() {
       method2();
       System.out.println("one");
   }

   void method2() {
       System.out.println("two");
   }

回到当前的问题:您会注意到documentation的“执行”是指在“将来的某个时间”运行Runnable。

实际上,这可能类似于将条目放入队列中,然后唤醒线程。与直线代码路径相比,启动并运行线程通常需要更多的机器指令。

所以,是的,您的“跑得这么快”的解释或多或少都有,除了“这么快”并不是真的快得让人眼花fast乱。

,

线程正在同时执行(主线程和辅助线程),尝试在main方法中的println之前暂停主线程执行一会儿,结果会有所不同。

Thread.sleep(1000);
System.out.println("rest od code..");
executorService.shutdown();

很有可能在主线程暂停期间重复运行和工作线程执行的机会。

期望的是内存一致性效果:

“在将Runnable或Callable任务提交给ExecutorService之前,线程中的操作发生在该任务执行的任何操作之前,而该操作又发生在通过Future.get()检索结果之前”。 >

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。