Un Thread est automatiquement candidat pour être détruit (par le garbage collection) lorsque son exécution est terminée.
Parfois, certains programmeurs utilisent des instances de Thread au lieu de Runnable.
Attention, si on crée un Thread et que l'on exécute
run(), et non
start(), cela peut conduire à des memory leek, l'instance de Thread ne sera pas libéré ainsi que toutes les références qu'il contient.
Ne créer des instances de java.lang.Thread que si vous en avez réellement besoin.
Ci dessous un exemple avec une méthode ayant comme paramètre un flag indiquant d'utiliser ou non un nouveau Thread pour exécuter une partie du code.
Code invalide
public void doSomething(boolean a_useThread) {
Thread t = new Thread() {
public void run()
{
// do something
}
};
if (useThread) {
t.start();
} else {
t.run(); // Le Thread ne sera jamais libérer
}
}
Utiliser plutot le code suivant
public void doSomething(boolean a_useThread) {
if (! useThread) {
// do something
} else {
Thread t = new Thread() {
public void run() {
// do something
}
};
t.start();
}
}
Utilisation de Runnable
public void doSomething(boolean a_useThread) {
Runnable r = new Runnable() {
public void run() {
// do something
}
};
if (! useThread) {
r.run();
} else {
(new Thread(r)).start();
}
}
Utilisation avec une autre méthode
public void doSomething() {
// do something
}
public void doSomething(boolean a_useThread) {
if (!useThread) {
doSomething();
} else {
Thread t = new Thread() {
public void run() {
doSomething();
}
};
t.start();
}
}