In einem Thread, der weiterläuft, sofern er nicht von außen abgebrochen wird, und wenn das Flag im eigenen Thread auch nach 1 Sekunde oder länger nach dem Start nicht gesetzt ist, möchte ich eine spezielle Operation ausführen. Before
Überprüfen Sie das Flag nach 1 Sekunde mit der Timer-Aufgabe
――Da es Timer-Threads gibt, sind die Threads verstreut und irgendwie durcheinander. ――Wenn die Anzahl der Flags und Felder zunimmt, müssen Sie über die exklusive Verarbeitung nacheinander nachdenken, was sehr schwierig ist.
public class AClass {
private AThread aThread=new AThread();
private volatile Handler mHandler;
public void start(){
aThread.start();
}
public void stop(){
aThread.mIsStopThread=true;
}
private class AThread extends Thread{
public volatile boolean mIsStopThread = false;
volatile private boolean mIsGot=false;
@Override
public void run() {
Timer mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {
if ( !mIsGot&&!mIsStopThread) {
//Wenn die gewünschten Daten auch nach 1 Sekunde nicht erhalten werden und der Thread nicht abgebrochen wird
}
}
});
}
}, 1000);
while (!mIsStopThread){
//Arbeiten Sie weiter, es sei denn, der Thread wird von außen abgebrochen
//Wenn Sie die gewünschten Daten erhalten, setzen Sie das Flag mIsGot
}
}
}
}
After Richten Sie keinen Timer-Thread ein, zeichnen Sie die Zeit auf, zu der der Thread gestartet wird, und beurteilen Sie anhand der Differenz zur aktuellen Zeit, ob 1 Sekunde vergangen ist.
public class AClass {
private AThread aThread=new AThread();
private volatile Handler mHandler;
public void start(){
aThread.start();
}
public void stop(){
aThread.mIsStopThread=true;
}
private class AThread extends Thread{
public volatile boolean mIsStopThread = false;
volatile private boolean mIsGot=false;
private long startTime;
@Override
public void run() {
super.run();
//Zeichne die erste Laufzeit des Threads auf
startTime = SystemClock.elapsedRealtime();
while (!mIsStopThread){
if (!mIsGot && (SystemClock.elapsedRealtime() - startTime) > 1000) {
//Wenn die gewünschten Daten auch nach 1 Sekunde nicht erhalten werden und der Thread nicht abgebrochen wird
}
//Arbeiten Sie weiter, es sei denn, der Thread wird von außen abgebrochen
//Wenn Sie die gewünschten Daten erhalten, setzen Sie das Flag mIsGot
if(!mIsGot){
//Wenn Sie es noch nicht genommen haben, legen Sie es in den Schlaf
try {
Thread.sleep(100);
} catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
}
}