首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主线程运行顺序

主线程运行顺序
EN

Stack Overflow用户
提问于 2016-05-31 11:55:52
回答 3查看 158关注 0票数 1

让我们考虑一下我们的思路:

代码语言:javascript
复制
public class HeavyWorkRunnable implements Runnable {

    @Override
    public void run() {
        System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
        try {
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
    }

    private void doDBProcessing() throws InterruptedException {
     //   TODO
    }
}

主要的方法是:

代码语言:javascript
复制
public class ThreadRunExample {
     public static void main(String[] args){

            Thread t1 = new Thread(new HeavyWorkRunnable(), "t1");
            Thread t2 = new Thread(new HeavyWorkRunnable(), "t2");
            System.out.println("Starting Runnable threads");

            t1.start();
            t2.start();
            System.out.println("Doing main heavy processing - START "+Thread.currentThread().getName());
            System.out.println("Runnable Threads has been started");
        }
}

现在,在不同的运行时,输出是不同的。例如:

Output1

启动可运行线程

做主要的重加工-启动主

做大量的处理-启动t1

做大量的处理-启动t2

重处理-端t2

已启动可运行线程

重处理-端t1

Output2

启动可运行线程

做主要的重加工-启动主

已启动可运行线程

做大量的处理-启动t1

重处理-端t1

做大量的处理-启动t2

重处理-端t2

根据我对线程的理解:

  1. 一次只能运行一个线程。
  2. 如果没有设置优先级,系统会随机选择线程来运行。

因此,系统应该完成“主”线程的任务,然后运行t1或t2。如果是这样的话,那么输出应该始终包含:

启动可运行线程

做主要重处理-启动主

可运行线程已启动

作为前三行。在我的理解中,我没有得到我错过的东西。

EN

回答 3

Stack Overflow用户

发布于 2016-05-31 12:15:30

问题是:操作系统和它们的处理队列是不同的。这是一个冗长的话题,但长话短说:当三个线程都在系统队列上时,操作系统只允许其中一个线程运行一小部分时间(称为量子),然后将其推入队列,让其他线程运行等等,从而幻想在单处理器--单核体系结构中进行多任务处理。因此,由于各种各样的原因,每次执行都将是不同的。

如果你真的想深入研究这个话题,就从这里开始吧,链接

票数 0
EN

Stack Overflow用户

发布于 2016-05-31 12:15:59

在单个处理器中,在给定时间只能运行一个线程,这是正确的。但是Java虚拟机包含一个称为线程调度器的组件。这个组件确实会选择哪个线程进入处理器,哪个线程退出。

启动线程时,它将进入runnable状态。当线程调度程序有一个用于处理时间的时隙时,它将从所有可运行的线程中挑选一个(如果它们都具有相同的优先级,则是随机的)。选中的线程进入running状态几毫秒后线程调度程序中断处理并将线程重新置于可运行状态。

因此,线程不能保证在离开处理器之前完成它的任务。

当您体验线程时,您应该考虑已经启动的所有线程都可以同时同时运行,因此没有保证的顺序。

您可能需要检查的是如何让线程等待其他线程(使用Object.wait()方法),但这远远超出了这个答案。

如果您需要深入研究Java中的线程处理,您应该考虑对在线资源进行特定的培训或google,因为这一点一点也不明显。

票数 0
EN

Stack Overflow用户

发布于 2016-05-31 12:38:25

首先,让我澄清一下您的理解:只有一个线程可以在给定的时间运行,这是正确的,但只适用于单核处理器,而不是多核处理器。

现在,主要的方法只是内部线程。现在,线程调度和时间切片取决于操作系统。因此,当您运行您的程序主方法时,它仍然在时间切片中,因此执行System.out.println("Doing main heavy processing - START "+Thread.currentThread().getName());语句,而不是执行进一步的语句。

如果您想要更改您的输出,那么您必须从OS的时间片中删除您的主线程。

因此,在t2.start();使用Thread.sleep(1000)之后,您可以检查您的t1或t2线程是否获得Scheduler并开始执行。

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

https://stackoverflow.com/questions/37545090

复制
相关文章

相似问题

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