web-dev-qa-db-ja.com

新しいRunnable()が、新しいスレッドはありませんか?

私はコードを理解しようとしています here 、具体的には匿名クラス

private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
   final long start = mStartTime;
   long millis = SystemClock.uptimeMillis() - start;
   int seconds = (int) (millis / 1000);
   int minutes = seconds / 60;
   seconds     = seconds % 60;

   if (seconds < 10) {
       mTimeLabel.setText("" + minutes + ":0" + seconds);
   } else {
       mTimeLabel.setText("" + minutes + ":" + seconds);            
   }

   mHandler.postAtTime(this,
           start + (((minutes * 60) + seconds + 1) * 1000));
   }
};

記事によれば

ハンドラーはメインスレッドの一部として更新コードを実行し、2番目のスレッドのオーバーヘッドを回避します。

新しいRunnableクラスを作成して、新しい2番目のスレッドを作成するべきではありませんか? RunnableクラスをpostAtTimeに渡すことができる以外に、ここでRunnableクラスの目的は何ですか?

ありがとう

18
sgarg

Runnableは、スレッドが実行するコードを提供するためによく使用されますが、Runnable自体はスレッドとは関係ありません。これはrun()メソッドを持つオブジェクトです。

Androidでは、Handlerクラスを使用して、別のコードではなく同じスレッドで後でコードを実行するようフレームワークに要求できます。 Runnableは、後で実行するコードを提供するために使用されます。

46
Wyzard

新しいThreadを作成したい場合は、次のようなことができます...

Thread t = new Thread(new Runnable() { public void run() { 
  // your code goes here... 
}});
27
Shashank Kadne

Runnableインターフェースは、Javaでのみ拡張できるため、Threadクラスを拡張する以外にマルチスレッドを実装できる別の方法です。 1つのクラス。

ただし、次のような new Thread(Runnable runnable) コンストラクターを使用できます。

private Thread thread = new Thread(new Runnable() {
public void run() {
   final long start = mStartTime;
   long millis = SystemClock.uptimeMillis() - start;
   int seconds = (int) (millis / 1000);
   int minutes = seconds / 60;
   seconds     = seconds % 60;

   if (seconds < 10) {
       mTimeLabel.setText("" + minutes + ":0" + seconds);
   } else {
       mTimeLabel.setText("" + minutes + ":" + seconds);            
   }

   mHandler.postAtTime(this,
           start + (((minutes * 60) + seconds + 1) * 1000));
   }
});

thread.start();
16
npinti

次のようなスレッドを作成できます。

 Thread thread = new Thread(new Runnable() {
                    public void run() {

                       }
                    });
                thread.start();

また、Runnable、Asyntask、Timer、TimerTaks、AlarmManagerを使用してスレッドを実行できます。

11
Victor Ruiz C.

Runnableは単なるメソッドであり、実行メソッドを提供します。スレッドは実装であり、Runnableを使用してメソッドrun()を呼び出します。

7
Matthias Bruns

新しいRunnableクラスを作成して、新しい2番目のスレッドを作成するべきではありませんか?

いいえ。newRunnableは2番目のThreadを作成しません。

RunnableクラスをpostAtTimeに渡すことができる以外に、ここでRunnableクラスの目的は何ですか?

RunnableHandlerに投稿されます。このタスクは、Handlerに関連付けられているスレッドで実行されます。

HandlerがUIスレッドに関連付けられている場合、RunnableはUIスレッドで実行されます。

Handlerが他のHandlerThreadに関連付けられている場合、RunnableはHandlerThreadで実行されます


ハンドラをMainThread(UIスレッド)に明示的に関連付けるには、以下のコードを記述します。

Handler  mHandler = new Handler(Looper.getMainLooper();

以下のように書くと、HandlerThread Looperを使用します。

HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());

2
Ravindra babu

最善かつ簡単な方法は、引数を渡してインスタンスを作成し、スレッドメソッドを呼び出すだけです

スレッドオブジェクトの作成を使用してスレッドを呼び出し、パラメータまたはパラメータなしで実行可能なクラスオブジェクトを送信し、スレッドオブジェクトのメソッドを開始します。

私の状態では、パラメーターを送信しており、runメソッドで使用します。

new Thread(new FCMThreadController( "2"、null、 "3"、 "1"))。start();

OR

new Thread(new FCMThreadController())。start();

public class FCMThreadController implements Runnable {
private String type;
private List<UserDeviceModel> devices;
private String message;
private String id;


    public FCMThreadController(String type, List<UserDeviceModel> devices, String message, String id) {

        this.type = type;
        this.devices = devices;
        this.message = message;
        this.id = id;
    }



    public FCMThreadController( ) {

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

    }



}
0
Sameer Kazi

スレッドはブランチのようなものです。多分岐とは、少なくとも2つの分岐がある場合を意味します。分岐が削減される場合、最小値は1つのままです。これは、削除されたブランチに似ていますが、一般的にはブランチとは見なされません。

同様に、少なくとも2つのスレッドがある場合、マルチスレッドプログラムと呼びます。スレッドが削減される場合、最小値は1つのままです。 Helloプログラムはシングルスレッドプログラムですが、書き込みや実行にマルチスレッドを知っている必要はありません。

簡単な言葉で言えば、プログラムがスレッドを持っているとは言えないということは、そのプログラムがマルチスレッドプログラムではなく、真の意味でシングルスレッドプログラムであることを意味します。マルチスレッド。

役に立たないコードを以下に示しますが、Runnableについての混乱をなくすだけで十分です。 「Hello World」と印刷されます。

class NamedRunnable implements Runnable {

    public void run() { // The run method prints a message to standard output.
        System.out.println("Hello World");
    }

    public static void main(String[]arg){ 
        NamedRunnable namedRunnable = new NamedRunnable( );
        namedRunnable.run();
    } 
}
0
Harjit Singh