【问题标题】:Can Java HTTP Client choak CPU if network is slow如果网络很慢,Java HTTP Client 可以阻塞 CPU
【发布时间】:2013-03-26 17:32:25
【问题描述】:

我有一个线程,它运行一个循环,在这个循环中它使用apache common http client 创建到远程服务器的连接并从中获取一些数据,然后休眠一段时间。我的问题是如果网络很慢,CPU 是否可以启动choaking,因为 GET 方法将需要更长的时间来获取数据并因此返回。

【问题讨论】:

    标签: java performance apache networking apache-commons-httpclient


    【解决方案1】:

    我不认为这会导致 CPU 负载过高,但是你的线程可能会在 GET 期间阻塞很长时间,这可能会导致你的程序看起来很慢。如果网络很慢,GET 应该等待 IO,这通常不会占用大量 CPU。

    【讨论】:

    • 所以当线程被阻塞时,这意味着线程仍在使用 CPU 并等待执行调用返回。这是同步调用吗???
    • 线程在等待时将使用很少的 CPU。调用是同步的。
    • 所以如果调用是同步的,是否不等于调用一个需要大量时间执行的函数。因此,就 CPU 而言,线程将处于运行状态。所以如果我们有很多这样的线程在做这种操作,CPU 就会开始阻塞
    • 线程在等待 IO 时没有消耗 CPU。许多广告可能处于这种“等待”状态,而不会在您的系统上运行高 CPU。
    • 线程处于runnng状态,但正在等待GET操作返回数据。等待占用的 CPU 很少。
    【解决方案2】:

    网络是一个 I/O 操作,它通常由外围设备执行,所以 CPU 只是等待操作完成。操作系统阻塞线程执行,直到 I/O 操作完成。见the lifecycle of threads,它有一个特殊的状态“阻塞I/O”。

    【讨论】:

    • 那么调用execute方法的线程,是否还在运行,等待execute返回??/
    • @abhinav "running" 和 "waiting" 是两种不同的状态。什么意思?
    • 所以我的问题是如果网络很慢,那么执行方法将需要更多的时间来运行和返回。因此线程将处于运行状态的时间更长。现在,如果我有很多这样的线程处于运行状态,因为执行方法没有返回,那么我的 CPU 不会显示高使用率
    • @abhinav 线程不执行方法,它执行指令。如果一个指令要等待,它会等待一些东西,例如对于您的情况下的网卡信号(中断)。看起来你需要学习一些低级的东西——操作系统如何工作、进程、线程、IO等。
    【解决方案3】:

    不,它不会卡住 CPU,但只会卡住应用程序(如果你有单独的网络线程,即使这也不会发生)

    由于网络操作是 I/O 操作,所以它不使用 CPU。因此,在您的线程的阻塞持续时间内,CPU 时间不会分配给该阻塞线程。

    【讨论】:

    • 所以当线程被阻塞时,这意味着线程仍在使用 CPU 并等待执行调用返回。这是同步调用吗???
    • 答案已编辑。是的,这是一个同步调用。 (但仅限于 I/O 设备)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多