Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Fils a Java

L’API de baix nivell de Java es basa en l’objecte Thread, que pot tenir una sèrie d’estats.

  • NEW: Un fil que no s’ha iniciat.
  • RUNNABLE: Un fil que s’està executant a la JVM. És possible que no tingui la CPU.
  • BLOCKED: Un fil que està esperant per entrar a un bloc sincronitzat (esperant un monitor lock).
  • WAITING: Un fil que espera indefinidament per un altre (operacions wait, join).
  • TIMED_WAITING: Un fil que espera un cert temps per un altre (operacions sleep, wait, join).
  • TERMINATED: Un fil que ha acabat. No es pot tornar a executar.

Podem crear un fil de dues maneres:

  • Estendre la classe Thread i reescriure el mètode “run” (millor no utilitzar aquest mètode).
  • Implementar la interfície Runnable i el seu mètode “run”. Llavors, crear un Thread passant aquest objecte al constructor:
    • new Thread(new MyRunnable())

Un cop tenim el Thread, el podem executar mitjançant el seu mètode start(), que farà canviar el seu estat de NEW a RUNNABLE.

Per als exemples que veurem a continuació, utilitzarem la següent utility class:

public class Threads {
 private static long start = System.currentTimeMillis();
 private Threads() {}
 public static void log(String message) {
  System.out.println(String.format("%6d %-10s %s",
   System.currentTimeMillis() - start,
   Thread.currentThread().getName(), message));
 }
 public static void spend(long millis) {
  long startTime = System.currentTimeMillis();
  while (System.currentTimeMillis() - startTime < millis);
 } 
 public static void rest(long millis) {
  try {
   Thread.sleep(millis);
  } catch (InterruptedException e) {
   throw new RuntimeException(e);
  }
 }
}

Els seus mètodes poden cridar-se després de fer un import static Threads.*;.

A continuació, podem veure un exemple de creació d’un fil anomenat “fil” des del fil principal, “main”. Mostra l’estat del fil “child” abans i després de la seva execució.

Aquest seria el codi:

public class StatesThread {
 static class MyRunnable implements Runnable {
  @Override
  public void run() {
   log("spending");
   spend(750);
   log("resting");
   rest(750);
   log("ending");
  }  
 } 
 public static void main(String[] args) {
  Thread thread = new Thread(new MyRunnable(), "child");
  log(thread.getState().name());
  thread.start();
  rest(250);
  log(thread.getState().name());
  rest(875);
  log(thread.getState().name());
  rest(500);
  log(thread.getState().name());
 }
}

Aquesta podria ser una sortida per pantalla possible:

     0 main       NEW
     8 child      spending
   258 main       RUNNABLE
   758 child      resting
  1133 main       TIMED_WAITING
  1508 child      ending
  1633 main       TERMINATED

Aquest exemple no presenta dificultats, ja que no es comparteix cap dada. Tampoc s’utilitza cap mecanisme de sincronització entre els dos fils.

Last change: , commit: 08d1c57