私はコードを理解しようとしています 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クラスの目的は何ですか?
ありがとう
Runnable
は、スレッドが実行するコードを提供するためによく使用されますが、Runnable
自体はスレッドとは関係ありません。これはrun()
メソッドを持つオブジェクトです。
Androidでは、Handler
クラスを使用して、別のコードではなく同じスレッドで後でコードを実行するようフレームワークに要求できます。 Runnable
は、後で実行するコードを提供するために使用されます。
新しいThread
を作成したい場合は、次のようなことができます...
Thread t = new Thread(new Runnable() { public void run() {
// your code goes here...
}});
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();
次のようなスレッドを作成できます。
Thread thread = new Thread(new Runnable() {
public void run() {
}
});
thread.start();
また、Runnable、Asyntask、Timer、TimerTaks、AlarmManagerを使用してスレッドを実行できます。
Runnableは単なるメソッドであり、実行メソッドを提供します。スレッドは実装であり、Runnableを使用してメソッドrun()を呼び出します。
新しいRunnableクラスを作成して、新しい2番目のスレッドを作成するべきではありませんか?
いいえ。newRunnable
は2番目のThread
を作成しません。
RunnableクラスをpostAtTimeに渡すことができる以外に、ここでRunnableクラスの目的は何ですか?
Runnable
はHandler
に投稿されます。このタスクは、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());
最善かつ簡単な方法は、引数を渡してインスタンスを作成し、スレッドメソッドを呼び出すだけです
スレッドオブジェクトの作成を使用してスレッドを呼び出し、パラメータまたはパラメータなしで実行可能なクラスオブジェクトを送信し、スレッドオブジェクトのメソッドを開始します。
私の状態では、パラメーターを送信しており、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
}
}
スレッドはブランチのようなものです。多分岐とは、少なくとも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();
}
}