首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么线程在Java中连续运行而不是同步运行?

为什么线程在Java中连续运行而不是同步运行?
EN

Stack Overflow用户
提问于 2014-11-20 12:51:46
回答 3查看 113关注 0票数 0

下面的代码中的线程似乎没有同时运行。但是,如果我将number更改为100万,或者在循环中添加一个Thread.sleep(50);,它将同时运行。使线程休眠产生一致的结果,同时将number增加到100万,使每个线程在切换到其他线程之前打印50+行。具体原因是什么?

代码语言:javascript
复制
class RunnableDemo implements Runnable {
    int number = 4;
    private Thread t;
    private String threadName;
    RunnableDemo(String name) {
        threadName = name;
    }

    public void run() {
        System.out.println("----------");
        for (int i = number; i > 0; i--) {
            System.out.println("Thread: " + threadName + ", " + i);
        }

    }

    public void start() {
        System.out.println("Starting " + threadName);
            t = new Thread(this, threadName);
            t.start();

    }

}

public class Test {
    public static void main(String args[]) {

        RunnableDemo R1 = new RunnableDemo("Thread-1");
        RunnableDemo R2 = new RunnableDemo("Thread-2");

        R1.start();
        R2.start();
    }
}

这是代码在number为4时产生的输出:

代码语言:javascript
复制
Starting Thread-1
Starting Thread-2
----------
Thread: Thread-1, 4
Thread: Thread-1, 3
Thread: Thread-1, 2
Thread: Thread-1, 1
----------
Thread: Thread-2, 4
Thread: Thread-2, 3
Thread: Thread-2, 2
Thread: Thread-2, 1
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-20 13:20:06

假设您的机器只有一个处理器。任何时候只有一个线程可以运行。如果多个进程正在运行,则每个进程都在处理器上接收一段时间,然后由某些调度算法交换掉。

在您的情况下,当数字为4时,线程可以在交换之前完成其工作。一旦完成,处于等待状态的任何其他线程都可以运行。

  • T1 >启动>执行>终止
  • T2 >启动>执行>终止

当将线程数量增加到100万时,线程只能在调度程序分配的时间内执行其部分工作。一旦这个时间结束,它将被调度程序替换掉,处于等待状态的另一个线程将运行。

  • T1 > starts >执行时间x>移动到等待状态
  • T2 > starts >执行时间x>移动到等待状态
  • T1 >简历>执行时间x>移动到等待状态
  • T2 >简历>执行时间x>移到等待状态.
  • T1 >终止
  • T2 >终止

因此,当您请求线程休眠为x时,可以将另一个线程移动到运行状态。

http://tinyurl.com/o8f3ogx

票数 2
EN

Stack Overflow用户

发布于 2014-11-20 12:56:06

System.out.println被缓冲。因此,您不能使用它同时测试线程。

票数 4
EN

Stack Overflow用户

发布于 2014-11-20 12:57:27

线程不必在每次指令之后进行必要的切换。线程完全有可能在切换到另一个线程之前执行整个循环。添加睡眠会延长执行时间,并增加上下文切换的可能性。

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

https://stackoverflow.com/questions/27040119

复制
相关文章

相似问题

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