Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在依赖参数所在的线程之外执行方法_Java_Android_Multithreading - Fatal编程技术网

Java 如何在依赖参数所在的线程之外执行方法

Java 如何在依赖参数所在的线程之外执行方法,java,android,multithreading,Java,Android,Multithreading,假设一个通用方法,即,sayHello(a),将参数str作为形式参数 new Thread(new Runnable() { @Override public void run() { String str = "Hello World"; sayHello(str); } }).start(); 我需要在这个线程之外执行sayHello(str)(或者更重要的是,在主线程内部),但是String str=“He

假设一个通用方法,即,
sayHello(a)
,将参数
str
作为形式参数

new Thread(new Runnable() {

    @Override
    public void run() {
        String str = "Hello World";
        sayHello(str);
    }           
}).start();

我需要在这个线程之外执行
sayHello(str)
(或者更重要的是,在主线程内部),但是
String str=“Hello World”必须在此新线程中执行。那么,我该如何解决这个问题呢?

在主线程中声明
str
,并在新线程中赋值,然后您可以调用
sayHello
方法。

使用
java.util.concurrent.FutureTask

new Thread(new Runnable() {

  @Override
  public void run() {
      final String str = "Hello World";

      runOnUiThread(new Runnable()
      {
          public void run()
          {
              sayHello(str);
          }
      });
  }

}).start();
来自JDK 6 api文档

 interface ArchiveSearcher { String search(String target); }
 class App {
   ExecutorService executor = ...
   ArchiveSearcher searcher = ...
   void showSearch(final String target) throws InterruptedException {
     Future<String> future = executor.submit(new Callable<String>() {
         public String call() { return searcher.search(target); }
     });
     displayOtherThings(); // do other things while searching
     try {
       displayText(future.get()); // use future
     } catch (ExecutionException ex) { cleanup(); return; }
   }
 }
接口ArchiveSearcher{字符串搜索(字符串目标);}
类应用程序{
executor服务executor=。。。
ArchiveSearcher搜索器=。。。
void showSearch(最终字符串目标)抛出InterruptedException{
Future=executor.submit(new Callable()){
公共字符串调用(){return search.search(target);}
});
displayOtherThings();//搜索时执行其他操作
试一试{
displayText(future.get());//使用future
}catch(ExecutionException ex){cleanup();return;}
}
}

检查类似问题“”的答案。它包含BlockingUnuiRunnable类的实现,应该可以解决您的问题。它还将同步运行sayHello()函数

为什么要标记android,是否要在UI线程之外的新线程中调用sayHello?抱歉,但为什么它必须是最终的?如果我在主线程中声明str并在新线程中赋值,那么str将变为“”(null),因为sayHello(str)方法在新线程之前执行,在本例中为str=“”1.我不明白你到底想干什么。为什么要在新线程之前打电话给SayHello?