Java-потоки ⬆️

Потоки — это класс Java, который позволяет программе работать эффективно и выполнять несколько задач одновременно, не прерывая основную программу в фоновом режиме.

Потоки — это просто класс Java, который одновременно способствует эффективной многозадачности программы.

Типы потоков Java

В Java существует два типа потоков:

  • Расширение класса Thread
  • Реализация интерфейса Runnable

Расширение класса Thread

Если класс расширяется до класса Thread, поток можно запустить, создав экземпляр класса и вызвав его start()метод: см. код⬇️

package myThreads;

public class Main extends Thread/* Here Main class extended to Thread class */{

    public static void main(String[] args) {
   // write your code here
        Thread thread = new Thread();// here the Thread class object created
        thread.start();// here the start() method is called
        System.out.println("I am running outside the thread.");// this runs outside the thread

    }
    public void run(){
        System.out.println("I am running inside the thread.");// this runs inside the thread
    }
}
}

Реализация интерфейса Runnable

Если класс реализует интерфейс Runnable, поток можно запустить, передав экземпляр класса методу start() объекта thread object: см. code⬇️

package myThreads2;

public class Main implements Runnable{

    public static void main(String[] args) {
   // write your code here
        Main obj = new Main();
        Thread thread = new Thread(obj);
        thread.start();
        System.out.println("I am running outside Runnable interface");
    }
    public void run(){
        System.out.println("I am running inside Runnable interface");

    }
}

Расширение потоков и реализация интерфейса Runnable

Расширение тем:

Класс, расширенный до thread class, не может быть расширен до любого другого класса.

Реализация интерфейса Runnable:

Можно расширить другой класс после реализации интерфейса Runnable. то есть myClass extend otherClass implements Runnable {}

package myThreads2;

public class myThreads2a {
    public static String aWord = "Java";
}
//this is a separate class the Main class extended from.
--------------------------------------------------------------------
//This is the main class.
package myThreads2;

public class Main extends myThreads2a implements Runnable{

    public static void main(String[] args) {
   // write your code here
        System.out.println(aWord);
        Main obj = new Main();
        Thread thread = new Thread(obj);
        thread.start();
        System.out.println("I am running outside Runnable interface");
    }
    public void run(){
        System.out.println("I am running inside Runnable interface");

    }
}

Проблемы параллелизма

Когда потоки и основная программа читают и записывают одни и те же переменные, значения непредсказуемы. Возникновение этой проблемы называется параллельным доступом.

package myThreads;

public class Main extends Thread/* Here Main class extended to Thread class */{
    static int x = 5;

    public static void main(String[] args) {
   // write your code here
        Thread thread = new Thread();// here the Thread class object created
        thread.start();// here the start() method is called
        System.out.println(x);// Boss2
        x++;
        System.out.println(x);// Boss3

    }
    public void run(){
        //x--;
        System.out.println("Boss1"+ x--);// Boss1
    }
}
// here there is conflict between these bosses

Победа над параллелизмом

Чтобы избежать проблем параллелизма, лучше всего использовать как можно меньше атрибутов между потоками. Если необходимо совместно использовать атрибуты, одним из возможных решений является использование isAlive()метода потока для проверки завершения выполнения потока перед использованием каких-либо атрибутов, которые поток может изменить. пр.⬇️

package myThreads;

public class Main extends Thread/* Here Main class extended to Thread class */{
    public static int x = 5;

    public static void main(String[] args) {
   // write your code here
        Thread thread = new Thread();// here the Thread class object created
        thread.start();// here the start() method is called
        while (thread.isAlive()){
            System.out.println("Loading......");
        }
        System.out.println(x);// Boss2
        x++;
        System.out.println(x);// Boss3

    }
    public void run(){
        x++;

    }
}
// here there is conflict between these bosses is solved by //displaying loading when conflict still occurs.

Чтобы узнать больше о Java, нажмите на меня

👋