gpt4 book ai didi

java - 事情似乎在并行运行 Java

转载 作者:行者123 更新时间:2023-11-29 19:48:36 25 4
gpt4 key购买 nike

我是 Java 的新手; (<= 哈哈,我只是输入了分号而不是点(经过 2 天的不停编码。把它留在那里,这样每个人也可以笑 :D )

我不确定我在找什么,所以标题不是很有用。

我能描述的就是事情似乎是并行的。我不确定如何解释这一点,所以我将向您展示一个示例。我有一个计时器类,它在每个循环中等待一段时间。

如果我运行以下方法(不是在定时器类中,而是在另一个类中),它不会像 for 循环那样等到 Runnable 部分 (Timer) 完成。它同时计算下面的代码。

如何让程序等待定时器完成?另外,为什么要并行运行?

我删减了大部分不必要的代码,但请询问您是否需要整个代码。

t = Timer;
public void turnend() {
if (leftover == 0) {
housenumber = 1;
Runnable r = new Runnable() {
@Override
public void run() {
//code1
if (housenumber == 8) {
t.stopTimer();
}
}
};
t = new Timer(r, 500, true);
}
//code 2
}
//code 1 and 2 runs at the same time

编辑:定时器类

import android.os.Handler;

public class Timer {
private Handler handler;
private boolean paused;

private int interval;

private Runnable task = new Runnable () {
@Override
public void run() {
if (!paused) {
runnable.run ();
Timer.this.handler.postDelayed (this, interval);
}
}
};

private Runnable runnable;

public int getInterval() {
return interval;
}

public void setInterval(int interval) {
this.interval = interval;
}

public void startTimer () {
paused = false;
handler.postDelayed (task, interval);
}

public void stopTimer () {
paused = true;
}

public Timer (Runnable runnable, int interval, boolean started) {
handler = new Handler ();
this.runnable = runnable;
this.interval = interval;
if (started)
startTimer ();
}

最佳答案

Android的主线程有点像

while (true) {
Runnable nextThingToDo = getNextTaskFromQueue();
nextThingToDo.run();
}

Handler 用于将新任务放入队列。您在 on???? 方法中编写的所有代码,如 Activity#onCreate 也是此类任务的一部分。诸如触摸事件处理和屏幕绘图更新之类的事情也出现在该队列中。因此,您绝不能暂停该线程,“稍后”做事的唯一方法是将其排队以备后用(该队列不是简单的先进先出队列,它支持延迟等)

现在,您的 Timer 安排 task Runnable 在设定的延迟后运行。由于调用 handler.postDelayed 的代码必然已经在这样一个可运行的内部,因此需要在队列可以获取并运行 task 之前完成它。那么在展开的 while 循环中发生的事情大致是

Runnable nextThingToDo = getNextTaskFromQueue(); 
nextThingToDo.run();
// inside above "run"... whatever code path leads to turnend()
if (leftover == 0) {
housenumber = 1;
Runnable r = construct();// it's only a reference to a `Runnable` object, nothing executes here
t = new Timer(r, 500, true);
// inside Timer
handler.postDelayed(task, 500); // task is now in the queue
}
//code 2 -- it actually runs now.
// whatever else is in your code on the way out from "turnend()"

// ... things happen, 500ms passes

Runnable nextThingToDo = getNextTaskFromQueue(); // this is the `task` object
nextThingToDo.run();
// inside this "run"
if (!paused) {
runnable.run (); // this is the `r` object
// inside task
{
// code1 -- running ~ 500ms after code2
if (housenumber == 8) {
t.stopTimer();
}
}

要解决您的问题,您首先应该明白编写随着时间的推移在多个步骤中发生的代码并不直接和简单,需要编写代码以便代码始终触发 future 的代码,这是一系列永无止境的事件。代码不能等待 future 的任务完成,你只能告诉 future 的代码一旦完成你想做什么。

例如通过将代码物理移动到它所属的位置:

public void turnend() {
if (leftover == 0) {
housenumber = 1;
Runnable r = new Runnable() {
@Override
public void run() {
//code1
if (housenumber == 8) {
t.stopTimer();
}
//code 2
}
};
t = new Timer(r, 500, true);
}
}

或者通过为 future 的代码提供对你希望被调用的代码的引用,这就是所谓的“回调”。最简单的形式:

    public void turnend() {
final Runnable callback = new Runnable() {
@Override
public void run() {
//code 2
}
};

if (leftover == 0) {
housenumber = 1;
Runnable r = new Runnable() {
@Override
public void run() {
//code1
if (housenumber == 8) {
t.stopTimer();
}
callback.run();
}
};
t = new Timer(r, 500, true);
}
}

每当你想写的时候

    public void things() {
// code 1
// delay of 500
// code 2
}

而是粗略地做:

    public void thingsPart1() {
// code1

handler.postDelayed(new Runnable() {
@Override
public void run() {
thingsPart2();
}
}, 500);
}

public void thingsPart2() {
// code 2
}

关于java - 事情似乎在并行运行 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37383944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com