2017-12-16 30 views
1

私はJavaでのスレッド化の経験はあまりありません。 Runnable(){}からString()の値をmain()で使用するにはどうすればよいでしょうか。コンパイル時にRunnableクラスオブジェクト

public class testInner { 
    public static void main (String[] args){ 
     Outer out =new Outer(); 
     out.makeinner(); 
     System.out.println("main :" + out.getft()); 
    } 
} 
public class Outer { 
    private volatile String ft; 
    public String getft(){ 
     return ft; 
    } 
    public void makeinner(){ 
     inner in = new inner(); 
     in.changeOuter(); 
    } 
    public class inner{ 
     public void changeOuter(){ 
      new Thread(new Runnable(){ 
       public void run(){ 
        ft = "what?"; 
        System.out.println("run :" + ft); 
       } 
      }).start(); 
     } 
    } 
} 

結果:

main :null 
run :what? 
+0

は、何かが差分スレッド内の文字列を計算します(聞こえます完了時に取得して印刷します) – Rogue

答えて

2

スレッドが並列に実行されているので、あなたは、あなたがSystem.out.println("main :" + out.getft());を行うときに、スレッドが正常に実行されていることを確認することはできません。このため、nullが得られ、そのスレッドはその変数をまだ編集していません。

あなたは、スレッドの実行が完了することを確認したい場合は、joinを使用する:あなたは `CompletableFuture `に似て何かを探しているよう

public class inner{ 
    public void changeOuter(){ 
     Thread myThread = new Thread(new Runnable(){ 
      public void run(){ 
       ft = "what?"; 
       System.out.println("run :" + ft); 
      } 
     }); 
     myThread.start(); 
     myThread.join(); // wait for the thread to finish before returning 

    } 
} 
+2

この場合、スレッドが完了するのを待つのは非常に冗長です。 – Zachary