关于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状态)
- .net – 从任务调用Thread.Sleep
- .net – 使用异步,等待与System.Threading.Thread.Sleep
- android-RxJava Thread.sleep在另一个线程
- android-避免使用RxJava的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
解决方法
但在大多数情况下,我更喜欢使用等待不阻塞线程的Task.Delay.
如果您正在使用Task.Run(使用ThreadPool线程),那么您应该尽量不阻止该线程.因为它是共享线程,所以可能还有其他代码在等待运行.
当我使用线程时,我仍然会使用Thread.Sleep(0)来产生处理器并放弃你的时间片.
.net – 使用异步,等待与System.Threading.Thread.Sleep
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更新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
我将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等相关知识,可以在本站进行查询。
本文标签: