GVKun编程网logo

NetBeans / Java /新提示:Thread.sleep在循环中调用(java thread sleep状态)

7

关于NetBeans/Java/新提示:Thread.sleep在循环中调用和javathreadsleep状态的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.net–从任务调用Thre

关于NetBeans / Java /新提示:Thread.sleep在循环中调用java thread sleep状态的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.net – 从任务调用Thread.Sleep、.net – 使用异步,等待与System.Threading.Thread.Sleep、android-RxJava Thread.sleep在另一个线程、android-避免使用RxJava的Thread.sleep等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

NetBeans / Java /新提示:Thread.sleep在循环中调用(java thread sleep状态)

NetBeans / Java /新提示:Thread.sleep在循环中调用(java thread sleep状态)

在NetBeans中,有一个新提示: Thread.sleep在循环中调用。

问题1: 循环睡眠的时间/时间是什么时候?

问题2: 如果有问题,我该怎么办?

更新:问题3:
这是一些代码。在这种情况下,请告诉我是否应该在循环中使用其他方法代替Thread.Sleep。简而言之,它由侦听客户端TCP连接的服务器使用。如果达到与客户端的最大会话数,则在此处使用睡眠。在这种情况下,我希望应用程序等待一个空闲会话可用。

public class SessionManager {    private static final int DEFAULT_PORT = 7500;    private static final int SLEEP_TIME = 200;    private final DatabaseManager database = new DatabaseManager();    private final ServerSocket serverSocket = new ServerSocket(DEFAULT_PORT);public SessionManager() throws IOException, SQLException{}public void listen(){while (true)    if (Session.getSessionCount() < Session.getMaxSessionCount())        try        {             new Thread(new Session(database, serverSocket.accept())).start();        }        catch (IOException ex) { ex.printStackTrace(); }    else        try        {            Thread.sleep(SLEEP_TIME);        }        catch (InterruptedException ex) { ex.printStackTrace(); }}public static void main(String[] args) throws IOException, SQLException{new SessionManager().listen();}}

答案1

小编典典

循环调用睡眠通常会导致性能下降。例如:

while (true) {    if (stream.available() > 0) {       // read input    }    sleep(MILLISECONDS);}

如果MILLISECONDS太大,则此代码将花费很长时间才能意识到输入可用。

如果MILLISECONDS太小,则此代码将浪费大量系统资源,以检查尚未到达的输入。

sleep循环中的其他用途通常也很可疑。通常有更好的方法。

如果有问题,我该怎么办?

发布代码,也许我们可以给您一个明智的答案。

编辑

IMO,解决此问题的更好方法是使用ThreadPoolExecutor

像这样:

public void listen() {    BlockingQueue queue = new SynchronousQueue();    ThreadPoolExecutor executor = new ThreadPoolExecutor(            1, Session.getMaxSessionCount(), 100, TimeUnit.SECONDS, queue);    while (true) {        try {            queue.submit(new Session(database, serverSocket.accept()));        } catch (IOException ex) {             ex.printStackTrace();        }    }}

这会将执行程序配置为匹配您的代码当前的工作方式。您可以通过多种其他方式来做到这一点。请参阅上面的javadoc链接。

.net – 从任务调用Thread.Sleep

.net – 从任务调用Thread.Sleep

在任务中使用Thread.Sleep()是否正确.或者只是一个与任务一起使用的计时器(.Net 4.5和后者中的Task.Delay())?或者可能存在另一种方法.

解决方法

您可以在任务中使用Thread.Sleep.
但在大多数情况下,我更喜欢使用等待不阻塞线程的Task.Delay.

如果您正在使用Task.Run(使用ThreadPool线程),那么您应该尽量不阻止该线程.因为它是共享线程,所以可能还有其他代码在等待运行.

当我使用线程时,我仍然会使用Thread.Sleep(0)来产生处理器并放弃你的时间片.

.net – 使用异步,等待与System.Threading.Thread.Sleep

.net – 使用异步,等待与System.Threading.Thread.Sleep

我开始使用.NET4.5进行异步处理等待.所有示例似乎使用以下来模拟长期操作:
await Task.Delay(3000);

现在我的长期计算真的很像:

System.Threading.Thread.Sleep(3000)

例如:

for(i=0;i<1000000000;i++)
    i=i*2;

如何使这个工作与异步等待?现在看来,我可以’只’使用诸如webrequest,WCF等的方法与这个伟大的新方法.

我在哪里错过了点?

解决方法

await Task.Run(() => Thread.Sleep(10000))

会工作,但它没有意义

android-RxJava Thread.sleep在另一个线程

android-RxJava Thread.sleep在另一个线程

如何在Android中每隔一秒钟使用RxJava更新UI?
我正在尝试做这样的事情:

 for (int i = 0; i <10 ; i++) { //test
               rx.Observable.just(getSleep())
                        .subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(v->updateTime());//update textView
        }

    private <T> int getSleep() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printstacktrace();
        }
        return 0;
    }

但是Thread.sleep()在ui线程中执行.
我做错了什么?

解决方法:

Observable.interval(1, TimeUnit.SECONDS) //emits item every second
            .observeOn(AndroidSchedulers.mainThread()) //switches thread from computation (interval's default) to UI
            .subscribe(i -> updateUI()); //update your textView

android-避免使用RxJava的Thread.sleep

android-避免使用RxJava的Thread.sleep

我将observable应用于此方法,但是在调用此方法后,它表示主线程上的工作过多.任何帮助表示赞赏

fun isBatteryHealthGood(): Observable<Boolean> {
        var count = 0
        intent = context.registerReceiver(broadCastReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))

    while (batteryStatus == null && count < maxCount) {
        Thread.sleep(1000)
        count++
    }
    return Observable.just(batteryStatus == BatteryManager.BATTERY_HEALTH_GOOD)
}

解决方法:

我的解决方案是通过使用interval operator避免使用Thread.sleep()
我认为您可以在isBatteryHealthGood()中忽略可观察的内容.

像这样返回布尔值:

//a simple function works here, no need
fun isBatteryHealthGood(): Boolean {


    return batteryStatus == BatteryManager.BATTERY_HEALTH_GOOD
}

最后像这样订阅:

Observable.
            interval(1000, TimeUnit.MILLISECONDS)
            take(maxCount) //place max count here
            .map { _ -> isBatteryHealthGood() }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.maintThread())
            .subscribe {
                batterystat ->
                //do what you need
            }

PS:您应该只注册一次接收器

intent = context.registerReceiver(broadCastReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))

今天关于NetBeans / Java /新提示:Thread.sleep在循环中调用java thread sleep状态的分享就到这里,希望大家有所收获,若想了解更多关于.net – 从任务调用Thread.Sleep、.net – 使用异步,等待与System.Threading.Thread.Sleep、android-RxJava Thread.sleep在另一个线程、android-避免使用RxJava的Thread.sleep等相关知识,可以在本站进行查询。

本文标签: