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, нажмите на меня
👋