Ich möchte Folgendes tun: 2 Thread führen die gleichen Runnable
Objekt. Sie werden eine Zufallszahl generieren. Schreiben Sie die Nummer in das Protokoll. Wenn die Nummer durch 7 teilbar ist, stoppen Sie beide Threads und eine Broadcast-Nachricht wird gesendet und der Broadcast-Empfänger platziert die letzte Nummer im Log mit einem neuen Tag. Ich habe sowohl interrupt()
und volatile versucht, aber aus irgendeinem Grund wird einer der beiden Thread eine zusätzliche Schleife vor dem Stopp laufen.Stoppen Sie zwei Threads, wenn die Bedingung erfüllen
public boolean onKeyDown(int keyCode, KeyEvent event) {
progDailog = ProgressDialog.show(this, "Progress dialog",
"Working....", true);
Thread one = new Thread(background, "first");
one.start();
Thread two = new Thread(background, "second");
two.start();
return true;
}//
Runnable background = new Runnable() {
public void run() {
while (num1 % 7 != 0 && num % 7 != 0) {
try {
// just doing some long operation
Thread.sleep(1000);
Random rand = new Random();
num = rand.nextInt(9000) + 1000;
name = Thread.currentThread().getName();
tag = "before";
Log.e(tag, name + ":" + num);
if (num % 7 == 0) {
num1 = num;
}
} catch (InterruptedException e) {
} finally {
handler.sendEmptyMessage(0);
progDailog.dismiss();
}
} ;
Intent myObserverSender = new Intent(
"action.GO");
msg = name + ":" + num;
myObserverSender.putExtra("serviceData", msg);
sendBroadcast(myObserverSender);
}
};
public class MyMainLocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context localContext, Intent callerIntent) {
String serviceData = callerIntent.getStringExtra("serviceData");
tag = "after";
Log.e (tag, serviceData);
}
}
Hier Endergebnis ist
before: first:7877
before: second:9165
before: first:6760
before: second:5663
After: second:5663 <<<< should stop here
before: first:8025 >>>> this's the extra loop
After: first:5663 >>> wrong
By the way, habe ich getan die Sendung richtig?
Ist das vollständige Code? Ich kann keinen Code sehen, um den Thread zu beenden. – Aakash
und ... setzen Sie ein ';' an der Endung '}' von while ...? – sharan
Total erwartet. Sie "sync" beide Thread "einmal in der Weile" (Wortspiel beabsichtigt), dass Sie überprüfen, Num1 durch 7 teilbar sein. Wenn beide von ihnen irgendwo innerhalb der while sind, werden beide ihren Zyklus beenden. Wenn Sie nicht möchten, dass der "spätere" Thread ein Ergebnis von "früherem" Thread überschreibt, müssten Sie noch einmal überprüfen, bevor Sie num1 ... setzen. – Fildor