如何从runnable或类似的方法返回一个布尔值?

时间:2015-11-12 15:12:50

标签: java return runnable

这是我现在的代码:

public class discoverRunnable implements Runnable{
      InetAddress address = null;
      boolean discovered;

      public discoverRunnable(InetAddress address){
            this.address = address;
            boolean discovered = false;
      }

      @Override
      public void run(){
            //some crazy stuff
            //may set discovered = true
      }
}

如何返回"发现"的价值?现在在线程中使用它? 它应该可以在不使用Android档案的PC上运行。

3 个答案:

答案 0 :(得分:5)

您可以使用Callable代替Runnable

public class DiscoverRunnable implements Callable<Boolean> {
  InetAddress address = null;
  boolean discovered;

  public DiscoverRunnable(InetAddress address){
        this.address = address;
        boolean discovered = false;
  }

  @Override
  public Boolean call(){
        //some crazy stuff
        //may set discovered = true
     return discovered;
  }

}

答案 1 :(得分:1)

在线程完成Runnable后,我无法访问成员变量。我可以让Callable以价值回报未来,没有问题。所以,我同意,在这些情况下总是使用Callable,你需要一个完成的runnable的值。

import java.util.*;
import java.util.concurrent.*;

class Main
{
    public static void main(String[] args) {
        ExecutorService ex = Executors.newFixedThreadPool(4);

        Runnable r1 = new Runnable() {
            private boolean flag = false;
            @Override
            public void run() {
                try {
                    System.out.println("Thread: " + Thread.currentThread().getName());
                    Thread.sleep((long)(Math.random() * 1000));
                    flag = true;
                } catch (InterruptedException ie) {
                    // do nothing
                }
            }
            public boolean getFlag() {
                return flag;
            }
        };

        Callable<Boolean> c1 = new Callable<Boolean>() {
            private boolean flag = false;
            @Override
            public Boolean call() {
                try {
                    System.out.println("Thread: " + Thread.currentThread().getName());
                    Thread.sleep((long)(Math.random() * 1000));
                    flag = true;
                } catch (InterruptedException ie) {
                    // do nothing
                }
                return getFlag();
            }
            public boolean getFlag() {
                return flag;
            }
        };

        ex.submit(r1);
        Future<Boolean> f = ex.submit(c1);

        ex.shutdown();

        if (c1 != null) {
            try {
                System.out.println("Callable future-get: " 
  + f.get()); //WORKS!: shows boolean value returned from future
                System.out.println("Callable direct-var: " 
  + ((Callable<Boolean>) c1).flag); //FAIL
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
        if (r1 != null) System.out.println("Runnable result: " 
  + ((Runnable) r1).flag); //FAIL
    }
}

答案 2 :(得分:0)

In Kotlin
 
fun checkWebUrl(): Boolean {

        val futureResult = FutureTask<Boolean>(Callable<Boolean> {
            webview_entry.url.startsWith("https://developer.android.com/reference/java/util/concurrent/FutureTask")
        })
        
        return futureResult.get()
    }