我正在尝试用Java做一些事情,我需要在while循环中等待/延迟一段时间.
while (true) {
if (i == 3) {
i = 0;
}
ceva[i].setSelected(true);
// I need to wait here
ceva[i].setSelected(false);
// I need to wait here
i++;
}
Run Code Online (Sandbox Code Playgroud)
我想构建一个步序器,我是Java的新手.有什么建议?
最近我正在阅读.NET Hashtable的实现,遇到了一些我不理解的代码.部分代码是:
int num3 = 0;
int num4;
do
{
num4 = this.version;
bucket = bucketArray[index];
if (++num3 % 8 == 0)
Thread.Sleep(1);
}
while (this.isWriterInProgress || num4 != this.version);
Run Code Online (Sandbox Code Playgroud)
整个代码是内public virtual object this[object key]的System.Collections.Hashtable(mscorlib程序版本= 4.0.0.0).
问题是:
在Thread.Sleep(1)那里的原因是什么?
我尝试使用以下代码在导航到下一个窗口之前延迟2秒.但线程首先调用,文本块显示一微秒并进入下一页.我听说调度员会这样做.
这是我的片段:
tbkLabel.Text = "two mins delay";
Thread.Sleep(2000);
Page2 _page2 = new Page2();
_page2.Show();
Run Code Online (Sandbox Code Playgroud) 我知道Thread.sleep()可以让java线程暂停一段时间,比如某些毫秒和某个纳秒.但问题是这个函数的调用也会导致开销.
例如,如果我想要一个线程暂停100纳秒,我调用Thread.sleep(0,100).这个过程的全部成本是invocation_cost + 100 nanosceonds,这可能比我想要的要大得多.我怎么能避免这个问题,实现我的目的呢?
我需要这个的原因是我想离线进行模拟.我描述了任务的执行时间; 现在我想通过在同一时间段内挂起一个线程来模拟这个执行时间.
谢谢!
目标:每隔一段时间执行一次代码.
问题:在性能方面,是否存在显着差异:
while(true) {
execute();
Thread.sleep(10 * 1000);
}
Run Code Online (Sandbox Code Playgroud)
和
executor.scheduleWithFixedDelay(runnableWithoutSleep, 0, 10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)
?
当然,后一种选择更犹豫不决.然而,我想知道我是否应该开始一项名为"花几天时间重构遗留代码以告别Thread.sleep()"的冒险.
更新:此代码在超级/超级/超高负载环境中运行.
假设我有一个线程,应该定期执行一些任务,但这个时期是 每小时6次每小时12次(每5分钟),我经常看到用一个is_running标志控制线程循环的代码,每个循环检查一次,如下所示:
std::atomic<bool> is_running;
void start()
{
is_running.store(true);
std::thread { thread_function }.detach();
}
void stop()
{
is_running.store(false);
}
void thread_function()
{
using namespace std::literals;
while (is_running.load())
{
// do some task...
std::this_thread::sleep_for(5min);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果stop()函数被调用,比如说,start()在线程处于活动状态之后1毫秒,直到它唤醒299999毫秒,检查标志并死掉.
我的理解是否正确?如何避免保持活着(但是睡觉)应该已经结束的线程?到目前为止,我最好的方法如下:
void thread_function()
{
using namespace std::literals;
while (is_running.load())
{
// do some task...
for (unsigned int b = 0u, e = 1500u; is_running.load() && (b != e); ++b)
{
// 1500 * 200 = 300000ms = 5min …Run Code Online (Sandbox Code Playgroud) 我正在制作一款安卓游戏,目前我还没有达到我想要的性能.我在自己的线程中有一个游戏循环,用于更新对象的位置.渲染线程将遍历这些对象并绘制它们.目前的行为似乎是波涛汹涌/不均匀的运动.我无法解释的是,在我将更新逻辑放入自己的线程之前,我在onDrawFrame方法中,就在gl调用之前.在这种情况下,动画非常流畅,当我尝试通过Thread.sleep来限制我的更新循环时,它只会变得不连贯/不均匀.即使我允许更新线程进行狂暴(无睡眠),动画也是平滑的,只有当涉及Thread.sleep时它才会影响动画的质量.
我已经创建了一个骨架项目来查看是否可以重新创建该问题,下面是渲染器中的更新循环和onDrawFrame方法: Update Loop
@Override
public void run()
{
while(gameOn)
{
long currentRun = SystemClock.uptimeMillis();
if(lastRun == 0)
{
lastRun = currentRun - 16;
}
long delta = currentRun - lastRun;
lastRun = currentRun;
posY += moveY*delta/20.0;
GlobalObjects.ypos = posY;
long rightNow = SystemClock.uptimeMillis();
if(rightNow - currentRun < 16)
{
try {
Thread.sleep(16 - (rightNow - currentRun));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的onDrawFrame方法:
@Override
public void onDrawFrame(GL10 gl) {
gl.glClearColor(1f, 1f, 0, 0); …Run Code Online (Sandbox Code Playgroud) 在我的考试课上,我确实需要睡一段时间。这是涉及定期远程调用的集成测试。
for (int i = 0; i < 16; i++) {
// sleep some... should sleep some...
Thread.sleep((int) TimeUnit.MINUTES.toMillis(4L)); // means as it means.
// call remote api and check the response.
}
Run Code Online (Sandbox Code Playgroud)
使用 Awaitility 的等效表达式是什么?
我试过...
// Let's sleep for 4 minutes, no matter what happen!
Awaitility.await()
.atLeast(Duration.ofMinutes(4L)) // what the hell does this mean, anyway?
.untilTrue(new AtomicBoolean(false));
Run Code Online (Sandbox Code Playgroud)
似乎在默认轮询间隔之后就触发了超时。
在这种情况下,我不应该在第一次使用 Awaitillity 吗?
首先,我不是要问与C#相同的问题- Thread.Sleep的替代方案?,或替代在C#中的Thread.Sleep?.我不认为我使用它不正确,需要一个真正的替代特定情况.
在代码分析运行期间,我看到了一个令人惊讶的违规行为:
Thread.Sleep()的使用是有缺陷设计的标志.
我们都知道线程创建很昂贵,线程中的阻塞意味着池上的争用.我们也知道每个线程将分配一个兆内存,因此它应该有一个短的寿命,在UI上阻塞是邪恶的,使用睡眠时间是不可靠的等等.这导致我的观点,如果你真的需要执行睡觉,如果不是Thread.Sleep你应该使用什么?
Peter继续提到零睡眠是Thread.Sleep唯一正确使用放弃线程的时间片并允许其他线程处理的唯一正确用法.然后更可怕的是,这仅仅是因为非托管线程的限制,如果在CLR中重新实现将产生在应用程序中使用Thread.Sleep的副作用.事实上,常见的不良用法的所有要点都是不良用法的好例子.
我在生产代码中有以下情况,使用Thread.Sleep非常成功:
在这种情况下不使用Thread.Sleep,我还有其他选择吗?紧密的循环往往会让事情变得更糟,我不相信这会使它的使用变成"设计缺陷",尤其是因为UI上没有任何东西,只有后台线程.在多线程环境中等待其他事物以及影响代码的外部因素,这只是软件的本质,有时您需要等待......
对于我的新Android应用程序,我需要一个函数,使我的应用程序超时3秒.我试过这个函数"sleep()",如下所示:
seekBar1.setProgress(50); // Set something for my SeekBar
try{
Thread.sleep(3000); // Wait for 3 Seconds
} catch (Exception e){
System.out.println("Error: "+e); // Catch the exception
}
button.setEnabled(true); // Enable my button
Run Code Online (Sandbox Code Playgroud)
它似乎工作,但如果我正在运行应用程序,它会这样做:等待3秒,设置进度和启用按钮.我想首先设置进度,然后等待3秒,然后才启用按钮.
"sleep()"是否适合我使用,或者我可以做什么,我的应用程序以正确的顺序执行此操作?