Java 线程返回值检查

Java 线程返回值检查,java,android,Java,Android,我实现了一个Runnable,它检查布尔值是否为真 但是我想把这个值返回给我的类,在那里我开始了线程 我注意到我可以用将来的callable返回一个值,使用它们我可以计算一些东西并立即返回它,但是我不能永久地检查这个值是否为真 我怎样才能做到这一点 谢谢你的帮助 public class ResultChecker implements Runnable{ private DrawView drawView; public ResultChecker(DrawView draw

我实现了一个Runnable,它检查布尔值是否为真

但是我想把这个值返回给我的类,在那里我开始了线程

我注意到我可以用将来的callable返回一个值,使用它们我可以计算一些东西并立即返回它,但是我不能永久地检查这个值是否为真

我怎样才能做到这一点

谢谢你的帮助

public class ResultChecker implements Runnable{
    private DrawView drawView;

    public ResultChecker(DrawView drawView){
        this.drawView = drawView;
    }

    public void run() {
        boolean run = true;
        while(run){
            if(drawView.isNextQuestion()){
                //RETURN VALUE HERE
                run = false;
            }
        }
    }

}

在原始线程中创建处理程序。然后,当您想要返回值时,在该处理程序上发送一条消息;消息可以包含将作为结果的任意对象。处理程序将在原始线程上执行其方法handleMessage,您可以在其中检查发送的消息并对结果作出反应。

我不明白您所说的**永久是什么意思**

这个怎么了

public Boolean call() { .. do something..
      return bool;        }

有两种方法可以将返回值返回到原始线程:

  • 原始线程可以定期轮询
    ResultChecker
    ,查看返回值是否可用
  • 原始线程可以阻塞,
    ResultChecker
    将在原始线程想要返回值时唤醒它

  • 如果您告诉我您喜欢哪种方法,我可以告诉您详细信息。

    如果您想要轮询,请在
    ResultChecker
    中创建一个方法,该方法可由需要返回值的线程调用

    public class ResultChecker implements Runnable{
        private DrawView drawView;
        private volatile Result r;
    
        public ResultChecker(DrawView drawView){
            this.drawView = drawView;
            this.r = null;
        }
    
        public Result poll() {
            return r;
        }
    
        public void run() {
            boolean run = true;
            while(run){
                if(drawView.isNextQuestion()){
                    //RETURN VALUE HERE
                    r = someObject;
                    // once r has been assigned, you cannot touch it again
                    // or the object it refers to from this thread because
                    // there are no locks
                    run = false;
                }
            }
        }
    
    }
    
    民意调查者将进行如下投票:

    r = resultChecker.poll();
    if(r != null) {
        // we have result
    } else {
        // result is not ready
        // try again later
    }
    

    如果要返回多个值,则必须使用队列对其进行扩展。

    能否尝试重新表述?“永久检查”是什么意思?我的意思是我想检查isNextQuestion(),直到停止线程。对于未来的可调用项,我只需检查一次,就可以得到一个返回值,返回值将为false。但当线程处于活动状态时,它可能会变成现实。。所以我想永久地检查它,并希望在完成线程之前收到正确的结果,因为它只检查一次drawView.isNextQuestion()并返回false。但是这个值可能会改变,它可能会变为真,所以只要我没有完成它,线程就应该检查它。我不确定这是否是一个好主意,但是您也可以尝试在if条件内设置一个字段变量
    if(cond){在这里使用setter设置字段变量。}
    但我没有原始线程。我有一个活动,在其中我开始这个线程。你的意思是我应该在一个线程中做一个线程?但是我更喜欢第一种方法..我说的“原始线程”是指你想要返回值的线程。我不在乎结果会是什么样。唯一重要的是,该值正在被发送到另一个线程。好的,您能告诉我如何使用方法Nr.1Mh执行此操作吗。。但是“以后再试”应该是什么样子呢?我不能再次调用该方法,我也会遇到同样的问题..我必须检查它,直到我离开此活动..是的,您可以随时调用它,直到结果不为null。如果我对你的计划多了解一点,我会说得更具体一些。您的活动在轮询之间需要做什么?另外,为什么您希望您的活动在单独的线程中而不是在活动中运行ResultChecker?我有一个活动和一个自定义视图。在我的自定义视图中,我可以执行一些拖放操作。如果这个拖放操作完成了,我更愿意在我的活动中检查是否所有的拖放操作都完成了。如果是,我想调用一个Intent并转到下一个活动。因此,用户将执行一系列拖放操作,当这些操作完成后,您希望您的活动检查ResultChecker中的结果?是这样吗?您如何知道用户何时完成拖放操作?用户不需要以某种方式指出这一点吗?