Dans un thread qui continue de fonctionner à moins d'être annulé de l'extérieur, si l'indicateur dans le propre thread n'est pas défini même après 1 seconde ou plus à partir du début de l'exécution, je souhaite effectuer une opération spéciale. Before
Allez vérifier le drapeau après 1 seconde avec la tâche du minuteur
―― Comme il y a des threads de minuterie, les threads sont dispersés et en quelque sorte foirés. ――Lorsque le nombre de drapeaux et de champs augmente, il faut penser au traitement exclusif un par un, ce qui est très difficile.
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) {
//Si les données souhaitées ne sont pas obtenues même après 1 seconde et que le thread n'est pas annulé
}
}
});
}
}, 1000);
while (!mIsStopThread){
//Continuer à travailler sauf si le fil est annulé de l'extérieur
//Lorsque vous obtenez les données souhaitées, définissez l'indicateur mIsGot
}
}
}
}
After Ne configurez pas de thread de minuterie, enregistrez l'heure à laquelle le thread commence à s'exécuter et évaluez si 1 seconde s'est écoulée en regardant la différence par rapport à l'heure actuelle.
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();
//Enregistrer la première exécution de Thread
startTime = SystemClock.elapsedRealtime();
while (!mIsStopThread){
if (!mIsGot && (SystemClock.elapsedRealtime() - startTime) > 1000) {
//Si les données souhaitées ne sont pas obtenues même après 1 seconde et que le thread n'est pas annulé
}
//Continuer à travailler sauf si le fil est annulé de l'extérieur
//Lorsque vous obtenez les données souhaitées, définissez l'indicateur mIsGot
if(!mIsGot){
//Si vous ne l'avez pas encore pris, mettez-le en sommeil
try {
Thread.sleep(100);
} catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
}
}