Java oqimlar (threads)


ULASHISH

Java oqimlar (threads)

Oqimlar (threads) bir vaqtning o‘zida bir nechta ishni bajarish orqali dasturning samaraliroq ishlashiga imkon beradi.

Oqimlar yordamida asosiy dasturni to‘xtatmasdan, fon rejimida murakkab vazifalarni bajarish mumkin.


Oqim yaratish

Oqim yaratishning ikki usuli bor.

Uni Thread sinfidan meros olib (extends), uning run() metodini qayta aniqlash orqali yaratish mumkin:

Extend sintaksisi

public class Main extends Thread {
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

Oqim yaratishning yana bir usuli — Runnable interfeysini amalga oshirish (implement):

Implement sintaksisi

public class Main implements Runnable {
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

Oqimlarni ishga tushirish

Agar sinf Thread sinfidan meros olsa (extends), oqimni shu sinfning nusxasini yaratib, uning start() metodini chaqirish orqali ishga tushirish mumkin:

Extend misoli

public class Main extends Thread {
  public static void main(String[] args) {
    Main thread = new Main();
    thread.start();
    System.out.println("This code is outside of the thread");
  }
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

O‘zingiz sinab ko‘ring »

Agar sinf Runnable interfeysini amalga oshirsa (implements), oqimni sinf nusxasini Thread obyektining konstruktoriga uzatib, so‘ngra oqimning start() metodini chaqirish orqali ishga tushirish mumkin:

Implement misoli

public class Main implements Runnable {
  public static void main(String[] args) {
    Main obj = new Main();
    Thread thread = new Thread(obj);
    thread.start();
    System.out.println("This code is outside of the thread");
  }
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

O‘zingiz sinab ko‘ring »

Oqimlarni "extend qilish" va "implement qilish" o‘rtasidagi farqlar

Asosiy farq shundaki, sinf Thread sinfidan meros olganda (extends) u boshqa hech qanday sinfdan meros ola olmaydi, Runnable interfeysini amalga oshirganda esa boshqa sinfdan ham meros olish mumkin, masalan: class MyClass extends OtherClass implements Runnable.



Parallellik muammolari (concurrency problems)

Oqimlar dasturning boshqa qismlari bilan bir vaqtda ishlagani sababli, kod qaysi tartibda bajarilishini bilishning iloji yo‘q. Oqimlar va asosiy dastur bir xil o‘zgaruvchilarni o‘qib-yozayotganda, qiymatlarni oldindan aytib bo‘lmaydi. Bundan kelib chiqadigan muammolar parallellik muammolari (concurrency problems) deb ataladi.

Misol

amount o‘zgaruvchisining qiymatini oldindan aytib bo‘lmaydigan kod misoli:

public class Main extends Thread {
  public static int amount = 0;

  public static void main(String[] args) {
    Main thread = new Main();
    thread.start();
    System.out.println(amount);
    amount++;
    System.out.println(amount);
  }

  public void run() {
    amount++;
  }
}

O‘zingiz sinab ko‘ring »

Parallellik muammolarining oldini olish uchun oqimlar o‘rtasida iloji boricha kamroq atributlarni umumiy qilgan ma’qul. Agar atributlarni umumiy qilish zarur bo‘lsa, yechimlardan biri — oqim o‘zgartirishi mumkin bo‘lgan atributlardan foydalanishdan oldin oqim ishini tugatgan-tugatmaganini tekshirish uchun uning isAlive() metodidan foydalanish.

Misol

Parallellik muammolarining oldini olish uchun isAlive() metodidan foydalaning:

public class Main extends Thread {
  public static int amount = 0;

  public static void main(String[] args) {
    Main thread = new Main();
    thread.start();
    // Wait for the thread to finish
    while(thread.isAlive()) {
      System.out.println("Waiting...");
    }
    // Update amount and print its value
    System.out.println("Main: " + amount);
    amount++;
    System.out.println("Main: " + amount);
  }
  public void run() {
    amount++;
  }
}

O‘zingiz sinab ko‘ring »




W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!