Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Java.doc
Скачиваний:
5
Добавлен:
17.04.2019
Размер:
261.63 Кб
Скачать

Способи реалізації багато поточності в java

Багато поточна програма – це програма, в якій присутні декілька потоків команд. Багато поточність дозволяє максимально використовувати ресурси. Для реалізації багато поточності в java існує 2 способи:

  1. використання успадкування thread

  2. реалізація інтерфейсу Runable

Коли програма запускається, в ній існує один потік, який називається основним. Якщо він завершується, то завершуються і всі під потоки. Тому необхідно слідкувати, щоб основний потік завершувався останній. Отримати вказівник можна наступним чином: і клас Thread і інтерфейс Runable містять метод Run, який програмісти повинні перевизначити і розмістити в ньому код окремого потоку. Приклад:

Class Thread incomplements Runnable

{

Thread f;

MyThread() {

F=new Thread (Alis,”ChildThread”);

System.out.println(“Child thread run”);

f.start

}

Public void …()

{

Try{

For (int i=0;i<5;i++);

{

System.out.println(“child”+i);

Sleep(500);

}

Cath(interruptedException e)

{e.printStackTrace();}

System.out.println(“End child thread”);

}

Public static void main (String arg[]) {

MyThread ch = new MyThread();

Try{

For (int i=0;i<n;i++) {

System.out.println(“Main-Thread”+i);

Thread.sleep(500);

}

Cht join();}

Cath(interruptedException e)

{e.printStackTrace();}

Після запуску програми в класі demo запускається створення нового потоку MainThread. Для цього отримують вказівник на потік, а після цього запускають дочірній потік на виконання t.start(); при такому виклику буде виконано запуск методу Run дочірнього потоку. В цей же самий момент продовжиться виконання основного потоку. Проте необхідно пам’ятати про те, що необхідно звільняти час від часу процесор щоб на нього можна було виконати інші задачі, потоки Thread.sleep(20); оскільки основний потік повинен завершуватись останній, то для цього можна скористатись методом join, призначений для циклічного опитування дочірнього потоку на працездатність. Таким чином ми здійснимо трой завершення програми. Для того, щоб переробити дану програму з використанням першого способу, необхідно замінити тільки одну строчку: Class Thread extends Thread.

Опишемо основні методи, які використовуються при роботі з потоками:

  1. currentThread() – статичний метод, який повертає об’єкт Thread, який виконується в даний момент часу.

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

  3. sleep(int n) – даний метод реалізує засипання поточного під процесу на n мілі секунд. Після того як цей інтервал часу закінчиться, процес знову буде здатний виконувати якійсь дії. (не факт, що процесор буде вільний).

у більшості виконуваних систем java системний годинник не дозволяє витримувати паузи коротші ніж 10 мілісекунд.

Методи об’єкта Thread:

Метод Start(). Після виклику цього методу буде запущений Run даного під процесу. Метод start може бути запущений тільки один раз. Метод Run – це тіло підпроцесу, який буде містити код, який необхідно викликати в цьому підпроцесі. Якщо відбувається вихід з методу Run під процес зупиняється.

Метод Stop - призводить до негайної зупинки під процесу. Більш акуратним способом зупинки під процесу являється введення деякої логічної змінної прапорця. І в методі Run буде здійснюватись перевірку цього прапорця.

Suspend – даний метод на відміну від метода Stop припиняє виконання під процесу не руйнуючи при цьому контекст під процесу. якщо виконання процесу зупинено цим методом, то можна активізувати процес методом Resume.

Resume – використовується для активізації під процесу, який призупинений викликом методу Suspend. При цьому не гарантується, що після виклику Resume, процес розпочне негайне виконання (гонка потоків).

setPriority – встановлює пріорітет під процесу. Пріорітет задається цілим значенням в діапазоні від 1 до 10. можна використати: MIN_PRIORITY NORM_ PRIORITY MAX_ PRIORITY більшість додатків користувача, які ми створюємо виконуються на рівні NORM_ PRIORITY +-1. пріорітет фонових задач, мереженого вводу-виводу, перемальовки екрана варто встановлювати в MIN_PRIORITY. Запуск під процесів зі значенням MAX_ PRIORITY вимагає обережності. Максимальний пріорітет має таймер.

getPriority – даний метод повертає пріорітет поточного процесу. Ціле значення в діапазоні від 1 до 10.

Якщо багато поточна програма використовує один і той самий метод (поле) і хоче виконувати (змінювати) одночасно, то їх необхідно визначати як synchronized. Наведемо приклад:

Class Callme

{

public void cell(String msg)

{

System.out.println(“[”+msg);

Try{

Thread sleep(1000);

} cath (…)

epentStackTrace();}

System.out.println(“]”);

Class Cellor implements Runnable

{

String mes;

Callme tanget;

Thread t;

Caller(Calling targ)

Mes = s;

T=newThread();

t.start;

}

Public void run()

{ target call(mes);

}

}

Class Synchronized …

{

Public static void main(String arg[])

{

Callme target = new Callme();

Caller ob1 = new Caller(target, “Hello”)

Caller ob2 = new Caller (target, “Synchronized”)

Caller obs = new Caller(target, “Word”);

Try{

Ob1.join();

Ob2.ioin();

Obs.join();

} ……

{………………}

}

}

Після запуску такої програми, ми отримаємо на екрані наступний вивід: [Hello[Synchronized[Word]]]. Такий вивід зумовлений тим, що виклик методу Call різними об’єктами здійснюється неодночасно. При цьому як бачимо відбувається накладення виводу один на одного. Якщо ж метод Call визначити з модифікатором Synchronized, то вивід на екран буде мати вигляд: [Hello][Synchronized][Word].

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]