Java Language Pitfall - Estensione di 'java.lang.Thread'

Esempio

Javadoc per la classe Thread mostra due modi per definire e utilizzare un thread:

Utilizzando una classe thread personalizzata:

 class PrimeThread extends Thread {
     long minPrime;
     PrimeThread(long minPrime) {
         this.minPrime = minPrime;
     }

     public void run() {
         // compute primes larger than minPrime
          . . .
     }
 }

 PrimeThread p = new PrimeThread(143);
 p.start();

Usando un Runnable :

 class PrimeRun implements Runnable {
     long minPrime;
     PrimeRun(long minPrime) {
         this.minPrime = minPrime;
     }

     public void run() {
         // compute primes larger than minPrime
          . . .
     }
 }

 PrimeRun p = new PrimeRun(143);
 new Thread(p).start();

(Fonte: java.lang.Thread javadoc .)

L'approccio alla classe del thread personalizzato funziona, ma presenta alcuni problemi:

  1. È scomodo utilizzare PrimeThread in un contesto che utilizza un pool di thread classico, un executor o il framework ForkJoin. (Non è impossibile, perché PrimeThread implementa indirettamente Runnable , ma l'uso di una classe Thread personalizzata come Runnable è certamente goffo e potrebbe non essere fattibile ... a seconda di altri aspetti della classe.)

  2. Vi sono più opportunità per errori in altri metodi. Ad esempio, se hai dichiarato un PrimeThread.start() senza delegare a Thread.start() , si otterrebbe un "thread" eseguito sul thread corrente.

L'approccio di mettere la logica del thread in un Runnable evita questi problemi. Infatti, se si utilizza una classe anonima (Java 1.1 in poi) per implementare il Runnable il risultato è più sintetico e più leggibile rispetto agli esempi precedenti.

 final long minPrime = ...
 new Thread(new Runnable() {
     public void run() {
         // compute primes larger than minPrime
          . . .
     }
 }.start();

Con un'espressione lambda (Java 8 in poi), l'esempio sopra sarebbe diventato ancora più elegante:

 final long minPrime = ...
 new Thread(() -> {
    // compute primes larger than minPrime
     . . .
 }).start();