Основи многопоточности

До цього всі дії в наших програмах виконувалися послідовно – одне за іншим Якщо програма викликає два методи, другий метод чекає, поки не виконається перший Іншими словами, кожна з наших програм має тільки одинпотік виконання (a thread)

Однак, в реальному житті ми можемо робити кілька речей одночасно, наприклад, їсти, розмовляти по телефону, дивитися телевізор і робити домашнє завдання Щоб виконувати всі ці

дії паралельно, Ми використовуємо кілька процесорів: Руки, очі і рот

На сьогодні, вo багатьох компютерах теж два або більше процесорів (CPU) Хоча, можливо, у вашому компютері тільки один процесор, який вважає, посилає команди монітора, диску, віддаленим компютерам і тд

Але навіть один процесор може виконувати декілька дій відразу, якщо програма використовує кілька потоків (multiple threads) Один Java – клас може запустити кілька потоків виконання, Які будуть змінюватися і отримувати свою частку процесорного временіХорошій приклад програми, яка створює кілька потоків – це web – браузер Ви можете дивитися Інтернет – сайти, поки гойдаються декілька файлів – одна програма запускає два потоку виконання

У наступній версії нашої пінг – понг гри буде один потік для отрисовки столу Другий потік буде вважати координати мяча і ракеток, і посилати команди по отрісовке вікна першому потоку Але спочатку, я покажу вам дві дуже прості програми, щоб ви краще зрозуміли, навіщо потрібні потокіКаждая з цих програм буде відображати кнопку і текстове поле

Коли ви натиснете кнопку Kill   Time, Програма почне цикл, який збільшує значення змінної триста тисяч разів Поточне значенняцієї змінної буде відображатися в заголовку вікна У класі NoThreadsSample тільки один потік виконання і вине зможете нічого надрукувати в текстовому полі, поки цикл не закінчиться Цей цикл забирає все процесорний час, тому вікно заблоковано

Скомпілюйте і запустіть цей клас, щоб переконатися, що вікно блокується протягом деякого часу Зауважте, що цей клас створює екземпляр класу JTextField і передає його в панель контенту без створення змінної Якщо ви не плануєте отримувати або встановлювати атрибути цього обєкта, вам не потрібна така змінна

import javaxswing* import javaawtGridLayout

import javaawteventActionListener

import javaawteventActionEvent

public class NoThreadsSample extends JFrame

implements ActionListener{

/ / Конструктор

NoThreadsSample(){

/ / Створити вікно з кнопкою і текстовим полем

GridLayout gl =new GridLayout(2,1)

thisgetContentPane()setLayout(gl)

JButton myButton = new JButton(&quotKill Time&quot)

myButtonaddActionListener(this)

thisgetContentPane()add(myButton)

thisgetContentPane()add(new JTextField())

}

/ / Оброблювач натискання кнопки

public void actionPerformed(ActionEvent e){

/ / Просто заморозити на деякий час,

/ / Щоб показати, що вікно заблоковано

for (int i=0 i&lt300000i++){

thissetTitle(&quoti=&quot+i)

}

}

public static void main(String[] args) {

/ / Створити вікно NoThreadsSample myWindow = new NoThreadsSample()

/ / Переконатися, що вікно закривається при натисканні на хрестик в кутку myWindowsetDefaultCloseOperation (WindowConstantsEXIT_ON_CLOSE) / / Встановити розміри вікна – координати лівого верхнього

/ / Кута і висоту з шириною

myWindowsetBounds(0,0,150, 100)

/ / Зробити вікно видимим myWindowsetVisible (true)

}

}

Наступна версія цього маленького віконця буде створювати і запускати окремий потік для циклу, і головний потік вікна дозволить друкувати в текстовому полі, поки цикл виполняетсяВи можете створити потік одним із таких способів: ü  Створити екземпляр Java – класу Thread і передати йому обєкт, який реалізує інтерфейс Runnable Якщо ваш клас реалізує інтерфейс Runnable, код буде виглядати так:

Thread worker = new Thread(this)

Цей інтерфейс вимагає написати в методі run () код, який буде виконуватися в окремому потоці

workerstart()

ü  Створити підклас класу Thread і реалізувати метод run () Длятого, щоб запустити потік, треба викликати метод start ()public class MyThread extends Thread{

public static void main(String[] args) { MyThread worker = new MyThread()

workerstart()

}

public void run(){

/ / Тут буде ваш код

}

}

У класі ThreadsSample я буду використовувати перший спосіб, тому що цей клас вже успадковується від JFrame, а наслідувати більше одного класу в Java не можна

import javaxswing* import javaawtGridLayout

import javaawteventActionListener

import javaawteventActionEvent

public class ThreadsSample extends JFrame

implements ActionListener, Runnable{

/ / Конструктор ThreadsSample () {

/ / Створити вікно з кнопкою і текстовим полем GridLayout gl =new GridLayout(2,1)

thisgetContentPane()setLayout(gl)

JButton myButton = new JButton(&quotKill Time&quot) myButtonaddActionListener(this) thisgetContentPane()add(myButton)

thisgetContentPane()add(new JTextField())

}

public void actionPerformed(ActionEvent e){

/ / Створити потік і виконати заморожуючий код

/ / Без блокування

Thread worker =  new Thread(this)

workerstart () / / Викликає метод run ()

}

public void  run(){

/ / Заморозити на деякий час, щоб показати, що / / елементи вікна НЕ блокуються

for (int i=0 i&lt300000i++){

thissetTitle(&quoti=&quot+i)

}

}

public static void main(String[] args) { ThreadsSample myWindow = new ThreadsSample()

/ / Переконайся, що вікно закривається після натискання на хрестик в кутку myWindowsetDefaultCloseOperation (WindowConstantsEXIT_ON_CLOSE)

/ / Встанови розміри вікна і зроби його видимим

myWindowsetBounds(0,0,150, 100)

myWindowsetVisible(true)

}

}

Після натискання на кнопку Kill  Time, Клас ThreadsSample запускає новий потік Після цього, потік з циклом і головний потік отримують по своїй частці процесорного часу І тепер ви можете друкувати в текстовому полі (головний потік), поки інший потік виконує цикл Вивчення потоків заслуговують набагато більшої уваги, ніж ці кілька сторінок, і я рекомендую вам почитати додатковий матеріали по цій темі

Джерело: Java Programming for Kids, Parents and Grandparents by Yakov Fain

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*