2016-11-25 28 views
0

私はアンドロイドアプリケーションを作成しています。 メインスレッドでは、メソッドを定義してメソッドを呼び出すことができ、コードをきれいに保つのに役立ちます。新しいスレッドでは、メソッドを定義して、すべてのコードを「1つのブロック」に書くのを避ける方法はありますか?メインスレッドで定義されたメソッドを呼び出すことは可能ですか、それとも何らかの形で新しいスレッド内でメソッドを定義できますか?スレッドのメソッドを作成するにはどうすればよいですか?

volatile Runnable feedToBuffer = new Runnable() 
     { 
      @Override 
      public synchronized void run() 
{ 
    if(boolean) 
    { 
    MethodA(); 
    } 
    else 
    { 
    MethodB(); 
    } 
} 

はなく、この: だから、明確にするために、私がやりたいことはこれです

volatile Runnable feedToBuffer = new Runnable() 
      { 
       @Override 
       public synchronized void run() 
    { 
     if(boolean) 
     { 
     //Code that was in MethodA 
     } 
     else 
     { 
     //Code that was in MethodB 
     } 
    } 
} 

が可能ということですか? 私はこの情報がおそらくどこかにあることを理解していますが、それを見つけられていないので、本当に助けに感謝します。 :)

+1

はい、もちろん可能です。 'run'メソッドは単なる通常のメソッドです。他のメソッドも呼び出すことができます。 – Thilo

+2

run()の後でそれらのメソッドを定義しました。 ''新しいRunnable(){/ *ここでは、すべてのメソッドを作成することができます* /} ' – AxelH

+3

' synchronized'メソッドを実行するのは不思議です。なぜあなたはそれを追加しましたか? – Thilo

答えて

1

これは完全に可能です。スレッドは単なる一連のアクションであり、メソッド呼び出しを含む場合、そのシーケンス内で実行されます。それは問題ではありません。

スレッドはコードの構造に結びついていません。開始するスレッドと、アプリケーションの起動時にすでに持っているスレッドの主な違いは、エントリポイントです。 Androidがメインスレッドを開始すると、ライフサイクルになるアクティビティ(onCreate())やボタンクリックリスナーなど、多くのポイントでアプリが入力されます。新しいスレッドを作成するときは、入力するポイントはrunで、必要なものを呼び出すことができます。

メインスレッドがイベントループを実行する点でも違いがあります。基本的には、処理しなければならないメッセージのキューがあります。待ち行列に何かが到着するたびに、それはメッセージを処理し、次に待機に戻ります。その意味では、メインスレッドは決して終了しません。ただし、スレッドはrunメソッドの最後に到達すると停止します。もちろん、あなた自身のスレッドのために同様のイベントループを実装することができます。

スレッドとは基本的な違いはありませんが、スレッドを自由に呼び出すことができます。もちろん、メインスレッド、同期などをブロックするのを避けるようなマルチスレッドのルールがありますが、1つの答えでカバーするのはあまりにも多くあります。

+0

基本的には、定義する時間がなくなる前にやっていない限り、mainからメソッドを呼び出すことができます別のスレッドがそのスレッドを使用しようとしていますか?これは知っておきたいことですが、私はこのケースではスレッドのメソッドを別々に定義することになります。なぜなら、最も安全だと思われるが、同期にチェックインするからです。 :) – gnyrfta

+1

@gnyrfta何も修正しない場合、同じメソッドを同時に呼び出すことができます。そうであれば、正しいプログラムを書くために同期を知る必要があります。私は[Oracleの同時実行チュートリアル](https://docs.oracle.com)を参照します。com/javase/tutorial/essential/concurrency/index.html)。あなたは本当にそれらを読む必要があります。そうしないと、ほとんどの場合うまくいくかもしれない間違ったコードを書いてしまいますが、予期せず失敗します。より高度なものについては、Java Concurrency in Practiceを読むことをお勧めします。これは非常に有用な本です。 – Malcolm

+0

ありがとう!私はそれを見ます。 – gnyrfta

関連する問題