Java multi-Thread

Per semplificare immaginiamo che il thread sia il cursore che esegue l’istruzione del programma (quando facciamo debug facciamo avanzare il cursore con F8).

1   public class ThreadExists {
2     public static void main(String args[]) {
3       Thread t = Thread.currentThread();
4       t.setName(“Thread principale”);
5       t.setPriority(10);
6       System.out.println(“Thread in esecuzione: ” + t);
7       try {
8         for (int n = 5; n > 0; n–) {
9           System.out.println(“” + n);
10          t.sleep(1000);
11        }
12      }
13      catch (InterruptedException e) {
14        System.out.println(“Thread interrotto”);

15      }
16    }
17  }

Output:

C:\TutorialJavaThread\Code>java ThreadExists

Thread in esecuzione: Thread[Thread principale,10,main]

5

4

3

2

1

Quando si avvia il programma Java crea un thread, che esegue appunto il programma, possiamo ottenere il thread attuale mediante l’istruzione alla riga 3 (Thread t = Thread.currentThread();) ottenuto il thread in esecuzione possiamo modificare oltre a modificare il nome, dargli un ritardo (t.sleep(1000);) infatti il codice precedente verà eseguito in circa 5 secondi.

Per avere più thread

quando si istanzia un oggetto Thread, bisogna passare al costruttore un’istanza di una classe che implementa l’interfaccia Runnable. I questo modo infatti, il nuovo thread, quando sarà fatto partire (mediante la chiamata al metodo start()), andrà ad eseguire il codice del metodo run dell’istanza associata.

1   public class ThreadCreation implements Runnable {
2     public ThreadCreation () {
3       Thread ct = Thread.currentThread();
4       ct.setName(“Thread principale”);
5       Thread t = new Thread(this, “Thread figlio”);
6       System.out.println(“Thread attuale: ” + ct);
7       System.out.println(“Thread creato: ” + t);
8       t.start();
9       try {
10        Thread.sleep(3000);
11      }
12      catch (InterruptedException e) {
13        System.out.println(“principale interrotto”);
14      }
15      System.out.println(“uscita Thread principale”);
16    }
17    public void run() {
18      try {
19        for (int i = 5; i > 0; i–) {
20          System.out.println(“” + i);
21          Thread.sleep(1000);
22        }
23      }
24      catch (InterruptedException e) {
25        System.out.println(“Thread figlio interrotto”);
26      }
27      System.out.println(“uscita Thread figlio”);
28    }
29    public static void main(String args[]) {
30      new ThreadCreation();
31    }
32  }

Output:

C:\TutorialJavaThread\Code>java ThreadCreation

Thread attuale: Thread[Thread principale,5,main]

Thread creato: Thread[Thread figlio,5,main]

5

4

3

uscita Thread principale

2

1

uscita Thread figlio

 

oppure

1   public class CounterThread extends Thread {
2     public void run() {
3       for (int i = 0; i<10; ++i)
4         System.out.println(i);
5     }
6   }

 

1   CounterThread thread = new CounterThread ();

2   thread.start();

 

Servlet

  • inferiore alla versione 2.5
    • nel file web.xml, contenuto in WEBINF
      • Es.: Quando l’URL finisce con /facebook, richiama FacebookServlet, che chiama it.servlet.facebook.FacebookServlet
            <servlet>
                <servlet-name>FacebookServlet</servlet-name>
                <servlet-class>it.servlet.facebook.FacebookServlet</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>FacebookServlet</servlet-name>
                <url-pattern>/facebook</url-pattern>
            </servlet-mapping>
  • superiore alla versione 3.1
    • La navigazione viene fatta attraverso le annotation
      • Es.: @WebServlet(value = “/*”, asyncSupported = true)

Ant

Per prima cosa diamo una lettura a Wikipedia. Detto in un altro modo serve per compilare un progetto organizzando al meglio le risorse e il tipo di compilazione.

Ci sono due modi per usarlo :

  • Dal filesystem
  • Dentro l’editor (per esempio Eclipse)

Dal filesystem

  1. Per prima cosa scarichiamolo da ant.apache.org
  2. Come di consueto (non si installa niente) si scompatta in una cartella
  3. Si settano le variabili d’ambiente (come settare le variabili d’ambiente):
    1. ANT_HOME: la root di Ant
    2. JAVA_HOME: la root del JDK (da verificare)
    3. Aggiungere al PATH la cartella bin di Ant
    4. Aggiungere al PATH la cartella bin del JDK (da verificare)
  4. Si usa Ant direttamente dal prompt dei comandi che usa un file .xml, di solito si chiama build.xml, quindi mi porto mi porto dove si trova il file build.xml, e digito ant deploy avviando il target deploy del build.xml

Da Eclipse

Comprende la gestione del file Ant, in particolare:

  • Per crearlo: Tasto destro del mouse sul progetto, nuovo – Other … – Ant
  • Per editare: con un doppio click (come al solito)
  • Per utilizzarlo: Si deve aprire la vista Ant: menu – Window – Show View – Other – Ant, disolito in basso si apre il tab Ant, si trascina il file build.xml qui e si lancia il targer che ci interessa con un doppio clck.

Build.xml

Il file è un insieme di target annidati tra loro, Ant si basa sulla dipendenza tra target, questo vuol dire che se abbiamo un target3 che ha target1 come dipendente, quando lancio target3 prima viene eseguito il target1.

Vediamo i taget più comuni:

  • <project>: target principale, sarebbe l’inizio del file
  • <target name=”main”> …. </target>: definisco un target di tipo main che contiene comandi
  • <echo message=”questo è un mex”/>:  serve per scrivere un messaggio o nella console di Eclipse o nel prompt dei comandi
  • <property nomeVariabile=”valore”/>: definisco variabile, può essere contenuta anche in un file esterno, si legge con ${nomeVariabile}, si definisce una volta sola e non può più cambiare
  • <jar>: crea il file jar
  • <war>: crea il file war
  • <javac>: compila i file java