Back Up Next

Niti - kaj in kako

 

Koda in podatki

Tek programa: ena nit

Dve niti

 
Večnitnost je eden osnovnih konceptov Jave. V vsaki Java aplikaciji ali apletu lahko paralelno teče več niti, ki si delijo procesorski čas;
Java podpira kontrolo nad nitmi (zaganjanje, ustavljanje,...), kot tudi kontrolo nad prioriteto izvajanja posameznih niti;
nit lahko v Javi naredimo:
 
razred ki bo vseboval kodo niti, izpeljemo iz razreda Thread ali implementiramo vmesnik Runnable. Oba pristopa sta ekvivalentna.
v izpeljanem, oz. implementiranem razredu prekrijemo metodo run, ki naj vsebuje kodo niti;
da nit zaženemo, preprosto naredimo instanco razreda, ki smo ga napisali, ter pokličemo metodo start;

Preprost primer


Njegova izboljšava


import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Nit1 extends Applet implements Runnable {

  Thread nit=null;
  int w, h;
  int x, y;
  int radius = 20;
  int dx , dy;
  //***************************************************
  public void init(){
 x = radius; y = radius;
        dx = 1; dy = 1;
        w = this.getSize().width;
        h = this.getSize().height;
  }
  //***************************************************
  public void paint(Graphics g){
      g.setColor(Color.blue);
      g.fillRect(0,0,w,h);
      g.setColor(Color.yellow);
      g.fillOval(x-radius,y-radius, 2*radius, 2*radius);
  }
//*****************************************************
public void start(){
    if(nit==null){
        nit =new Thread(this);
        nit.start();
    }
}

//*****************************************************
public void run(){
   while(nit != null){
      try {Thread.sleep(10);}catch(InterruptedException e){}
      x = x + dx;
      y = y + dy;
      if (x > (w - radius)) {
   x = w - radius; dx = -1;
      }
      if (y > (h - radius)) {
   y = h - radius; dy = -1;
      }
      if (x < radius) {
          x = radius; dx = 1;
      }
      if (y < radius) {
          y = radius; dy = 1;
      }
      repaint();
   }
}

//*****************************************************
  public void stop(){
     if(nit != null) nit.stop();
     nit=null;
  }

}

Primer aplikacije, ki poleg main ustvari še pet niti, od katerih vsaka izpisuje števila od 1000 do 0. Z opazovanjem izpisa lahko vidimo, kako JVM preklaplja med nitmi.

class SimpleThread extends Thread {  // razred niti
    private int countDown = 1000;   
    private int threadNumber;
    private static int threadCount = 0;
    public SimpleThread() {  // v konstruktorju si le zapomnimo številko niti, da jih razlikujemo med seboj
        threadNumber = ++threadCount;
        System.out.println("Making " + threadNumber);
    }
    public void run() { // run vsebuje kodo niti; tu preprosto izpisujemo števila v zanki
        for (int i=countDown;i>=0;i--) {
            System.out.println("Thread " + threadNumber + "(" + i + ")");
        }
    }
} 
class test {
    public static void main(String[] args) {
        for(int i = 0; i < 5; i++)
            // ko naredimo instanco nitnega razreda, in pokličemo start se nit zažene - izvede se metoda run
            new SimpleThread().start(); 
        System.out.println("All Threads Started");
    }
}
Back Up Next