Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Потоки в Java | Основи Багатопотоковості
Багатопотоковість у Java

bookПотоки в Java

Наприклад, уявіть, що ваша програма має головний потік (main thread), який відповідає за відображення інтерфейсу користувача. Одночасно можна створити додатковий потік для завантаження даних з мережі або виконання складних обчислень. Це допомагає зробити програму більш чутливою та ефективною.

Оголошення потоку в Java

За допомогою класу Thread можна створити підклас класу Thread та перевизначити метод run() , який містить код, що виконуватиметься у новому потоці.

Main.java

Main.java

copy
123456789
// Create a new thread using an anonymous subclass of `Thread` Thread thread = new Thread() { public void run() { // Code that will execute in the new thread } }; // Start the thread execution thread.start();

Використання інтерфейсу Runnable

За допомогою інтерфейсу Runnable можна реалізувати інтерфейс Runnable, надати метод run() і передати його у конструктор класу Thread.

Main.java

Main.java

copy
123456789101112
// Create a new `Runnable` instance with an anonymous class implementing the run method Runnable runnable = new Runnable() { public void run() { // Code that will execute in the new thread } }; // Create a new `Thread` instance, passing the `Runnable` as argument Thread thread = new Thread(runnable); // Start the thread execution thread.start();

Наслідування класу Thread

Альтернативно можна наслідувати клас Thread і перевизначити метод run().

Main.java

Main.java

copy
123456789
// The `MyThread` class extends the `Thread` class to create a custom thread public class MyThread extends Thread { // The run method is overridden to define the task that the thread will execute @Override public void run() { // Code to be executed by the thread should go here } }

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

Можна також реалізувати інтерфейс Runnable і в ньому реалізувати метод run():

Main.java

Main.java

copy
123456789
// The `MyThread` class implements the `Runnable` interface to create a custom task public class MyThread implements Runnable { // The run method is overridden to define the task that will be executed when the thread runs @Override public void run() { // Code to be executed by the thread should go here } }
Note
Примітка

Метод run() у Java потоці дозволяє виконувати код в окремому потоці, включаючи такі завдання, як робота з даними, обчислення, завантаження файлів, а також відправлення або отримання даних через мережу.

Різниця між Thread та Runnable

У Java Thread — це спеціальний канал, який дозволяє одночасне виконання завдань, забезпечуючи виконання операцій у окремому потоці, наприклад, обчислення або тривалі процеси на кшталт завантаження даних.

Інтерфейс Runnable з єдиним методом run() визначає завдання, яке виконується потоком. Ви можете передати реалізацію Runnable у конструктор Thread, щоб виконати завдання в новому потоці. Такий підхід допомагає ефективно керувати та виконувати паралельні завдання.

Методи, доступні для потоків у Java

Розглянемо запуск потоку за допомогою методу start(), який вказує, що код має виконуватися у новому потоці. Це означає, що основний потік продовжує виконання власного коду і не чекає, поки новостворений потік завершить роботу.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526
package com.example; public class Main { public static void main(String[] args) throws InterruptedException { // Create a new thread that will sleep for 5 seconds Thread thread = new Thread(() -> { try { Thread.sleep(5000); // Simulate work by sleeping for 5 seconds } catch (InterruptedException e) { throw new RuntimeException(e); // Handle interruption by rethrowing as a runtime exception } }); // Start the thread thread.start(); // Check if the thread is alive before calling `join()` System.out.println("Is the thread alive before the join() method: " + thread.isAlive()); // Wait for the thread to finish execution thread.join(); // Check if the thread is alive after `join()` System.out.println("Is the thread alive after join(): " + thread.isAlive()); } }

Маємо також метод для головного потоку, який дозволяє йому чекати на завершення виконання потоку, який він запустив, використовуючи метод join(). Цей метод очікує, поки потік повністю виконається. Перевірити, чи потік наразі виконується, можна за допомогою методу isAlive().

Код Thread.sleep(5000) призупиняє потік на 5000 мілісекунд (5 секунд).

try {
    Thread.sleep(5000); // Simulate work by sleeping for 5 seconds
} catch (InterruptedException e) {
    throw new RuntimeException(e); // Handle interruption by rethrowing as a runtime exception
}

У прикладі до виклику join() потік працював. Після виклику join() — ні, оскільки join() означає, що ми будемо очікувати в цій точці, поки потік не завершить виконання.

Якщо потрібно зупинити потік, можна скористатися методом interrupt(). Однак, щоб це спрацювало, необхідно перевіряти, чи потік, який зупиняється, був перерваний.

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233
package com.example; public class Main { public static void main(String[] args) throws InterruptedException { // Create a thread that will perform some task Thread thread = new Thread(() -> { // Loop runs until the thread is interrupted while (!Thread.currentThread().isInterrupted()) { System.out.println("Thread is running..."); // Simulate some work with a delay try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Thread was interrupted during sleep."); // Re-interrupt the thread to ensure the loop exits Thread.currentThread().interrupt(); } } System.out.println("Thread is exiting..."); }); // Start the thread thread.start(); // Let the thread run for a bit Thread.sleep(3000); // Interrupt the thread thread.interrupt(); } }

У цьому прикладі створюється потік, який виконує задачу в циклі, поки його не перервано. Коли потік переривається під час сну, виникає виняток, який обробляється шляхом встановлення прапорця переривання, після чого потік завершується.

Без обробника винятку InterruptedException у потоці, потік не буде перервано.

Note
Примітка

Ці методи дозволяють керувати життєвим циклом і виконанням потоків у Java, забезпечуючи гнучкість і контроль над багатопотоковими застосунками. У наступних розділах ми розглянемо ці методи детальніше.

1. Що таке потік у Java?

2. У чому різниця між класом Thread та інтерфейсом Runnable у Java?

question mark

Що таке потік у Java?

Select the correct answer

question mark

У чому різниця між класом Thread та інтерфейсом Runnable у Java?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 3

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Awesome!

Completion rate improved to 3.33

bookПотоки в Java

Свайпніть щоб показати меню

Наприклад, уявіть, що ваша програма має головний потік (main thread), який відповідає за відображення інтерфейсу користувача. Одночасно можна створити додатковий потік для завантаження даних з мережі або виконання складних обчислень. Це допомагає зробити програму більш чутливою та ефективною.

Оголошення потоку в Java

За допомогою класу Thread можна створити підклас класу Thread та перевизначити метод run() , який містить код, що виконуватиметься у новому потоці.

Main.java

Main.java

copy
123456789
// Create a new thread using an anonymous subclass of `Thread` Thread thread = new Thread() { public void run() { // Code that will execute in the new thread } }; // Start the thread execution thread.start();

Використання інтерфейсу Runnable

За допомогою інтерфейсу Runnable можна реалізувати інтерфейс Runnable, надати метод run() і передати його у конструктор класу Thread.

Main.java

Main.java

copy
123456789101112
// Create a new `Runnable` instance with an anonymous class implementing the run method Runnable runnable = new Runnable() { public void run() { // Code that will execute in the new thread } }; // Create a new `Thread` instance, passing the `Runnable` as argument Thread thread = new Thread(runnable); // Start the thread execution thread.start();

Наслідування класу Thread

Альтернативно можна наслідувати клас Thread і перевизначити метод run().

Main.java

Main.java

copy
123456789
// The `MyThread` class extends the `Thread` class to create a custom thread public class MyThread extends Thread { // The run method is overridden to define the task that the thread will execute @Override public void run() { // Code to be executed by the thread should go here } }

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

Можна також реалізувати інтерфейс Runnable і в ньому реалізувати метод run():

Main.java

Main.java

copy
123456789
// The `MyThread` class implements the `Runnable` interface to create a custom task public class MyThread implements Runnable { // The run method is overridden to define the task that will be executed when the thread runs @Override public void run() { // Code to be executed by the thread should go here } }
Note
Примітка

Метод run() у Java потоці дозволяє виконувати код в окремому потоці, включаючи такі завдання, як робота з даними, обчислення, завантаження файлів, а також відправлення або отримання даних через мережу.

Різниця між Thread та Runnable

У Java Thread — це спеціальний канал, який дозволяє одночасне виконання завдань, забезпечуючи виконання операцій у окремому потоці, наприклад, обчислення або тривалі процеси на кшталт завантаження даних.

Інтерфейс Runnable з єдиним методом run() визначає завдання, яке виконується потоком. Ви можете передати реалізацію Runnable у конструктор Thread, щоб виконати завдання в новому потоці. Такий підхід допомагає ефективно керувати та виконувати паралельні завдання.

Методи, доступні для потоків у Java

Розглянемо запуск потоку за допомогою методу start(), який вказує, що код має виконуватися у новому потоці. Це означає, що основний потік продовжує виконання власного коду і не чекає, поки новостворений потік завершить роботу.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526
package com.example; public class Main { public static void main(String[] args) throws InterruptedException { // Create a new thread that will sleep for 5 seconds Thread thread = new Thread(() -> { try { Thread.sleep(5000); // Simulate work by sleeping for 5 seconds } catch (InterruptedException e) { throw new RuntimeException(e); // Handle interruption by rethrowing as a runtime exception } }); // Start the thread thread.start(); // Check if the thread is alive before calling `join()` System.out.println("Is the thread alive before the join() method: " + thread.isAlive()); // Wait for the thread to finish execution thread.join(); // Check if the thread is alive after `join()` System.out.println("Is the thread alive after join(): " + thread.isAlive()); } }

Маємо також метод для головного потоку, який дозволяє йому чекати на завершення виконання потоку, який він запустив, використовуючи метод join(). Цей метод очікує, поки потік повністю виконається. Перевірити, чи потік наразі виконується, можна за допомогою методу isAlive().

Код Thread.sleep(5000) призупиняє потік на 5000 мілісекунд (5 секунд).

try {
    Thread.sleep(5000); // Simulate work by sleeping for 5 seconds
} catch (InterruptedException e) {
    throw new RuntimeException(e); // Handle interruption by rethrowing as a runtime exception
}

У прикладі до виклику join() потік працював. Після виклику join() — ні, оскільки join() означає, що ми будемо очікувати в цій точці, поки потік не завершить виконання.

Якщо потрібно зупинити потік, можна скористатися методом interrupt(). Однак, щоб це спрацювало, необхідно перевіряти, чи потік, який зупиняється, був перерваний.

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233
package com.example; public class Main { public static void main(String[] args) throws InterruptedException { // Create a thread that will perform some task Thread thread = new Thread(() -> { // Loop runs until the thread is interrupted while (!Thread.currentThread().isInterrupted()) { System.out.println("Thread is running..."); // Simulate some work with a delay try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Thread was interrupted during sleep."); // Re-interrupt the thread to ensure the loop exits Thread.currentThread().interrupt(); } } System.out.println("Thread is exiting..."); }); // Start the thread thread.start(); // Let the thread run for a bit Thread.sleep(3000); // Interrupt the thread thread.interrupt(); } }

У цьому прикладі створюється потік, який виконує задачу в циклі, поки його не перервано. Коли потік переривається під час сну, виникає виняток, який обробляється шляхом встановлення прапорця переривання, після чого потік завершується.

Без обробника винятку InterruptedException у потоці, потік не буде перервано.

Note
Примітка

Ці методи дозволяють керувати життєвим циклом і виконанням потоків у Java, забезпечуючи гнучкість і контроль над багатопотоковими застосунками. У наступних розділах ми розглянемо ці методи детальніше.

1. Що таке потік у Java?

2. У чому різниця між класом Thread та інтерфейсом Runnable у Java?

question mark

Що таке потік у Java?

Select the correct answer

question mark

У чому різниця між класом Thread та інтерфейсом Runnable у Java?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 3
some-alt