Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
JAVA лекции.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
86.26 Кб
Скачать

Вопрос 11. Реализация многопоточности. Создание и запуск потока. Синхронизация потоков.

Многопоточность.

Существует 2 способа создания нового потока:

  1. Определение класса, производного от класса Thread и создание экземпляров.

При запуске потока будет вызван метод run().

Пример:

import java.lang.*;

public class MyThread extends Thread

{ int wait

public MyThread(int wait) {this.wait = wait;}

public void run()

{ while (true)

{

Sleep(wait);

. . .

}

}

}

. . .

public static void main(…)

{

MyThread m = new MyThread(1000);

m.start( );

}

Пример 2:

import java.lang.*;

public class MyThread extends Thread

{

public static void main(String [] a)

{

MyThread m = new MyThread( );

m.start( );

for (int i=0; i<1000; i++) {

System.out.println(“main = “ +i);}

}

public void run( ) {

for (int j=0; j<1000; j++) {

System.out.println(“Thread = “ +j);}

}

  1. Создание класса, реализующего интерфейс Runnable.

public class My implements Runnable

{

public My( ) {. . .}

public void run( ) {. . .}

{

My m = new My( );

Thread f = new Thread(m);

f.start( );

}

}

В этом случае поток можно создавать в разных классах.

Прерывание потока.

MyThread m = new MyThread( );

m.start( );

m.interrupt( );

public void run( );

{

while (! is Interrubt( ));

{

. . .

}

}

Синхронизация.

Основное отличие состоит в том, что (?).

Использование потоков лишенных подобной защиты позволяет быстро их запускать и способствует повышению их производительности. Однако, возникает отрицательный эффект: любой из потоков может получить доступ и даже внести изменения в данные, которые другой поток считает принадлежащими только ему. Решение этой проблемы состоит в синхронизации потоков.

Пример: имитация работы ядерного реактора.

inThread = new RodThread(true);

outThread = new RodThread(false);

inThread.start;

outThread.start;

public class RodThread extends Thread

{ boolean direct;

int static position – 10;

int count = 0;

static TextArea fText;

public RodThread (boolean direct)

{ this.direct = direct);}

public void run( );

while (position > 0 && position<10 && position<1000)

{ if (direct) position ++; else position --; count ++}

. . .

synchronized(fText){

fText.append(“Final position = “ +position);

fText.append(“Count = “ + count);

}

}

После тысячекратного выполнения работа потоков завершится с выводом в поле fText информации о результатах работы потоков. При продолжении тестировании выяснится, что иногда информация, размещенная в поле fText разными потоками, оказывается перемешанной. Это происходит, когда оба потока выполняют процесс записи в поле одновременно. Решение данной проблемы состоит в получении гарантии, что в любой момент времени только 1 из потоков может получить доступ к полю fText. Для этого в JAVA существует слово synchronized. В этом случае 1 из потоков, войдя в критический участок программы, осуществляет захват поля fText. Если другой поток также попытается войти в этот участок программы, то он будет заблокирован оператором synchronized. Чем меньше размер критического участка, тем больше производительность программы.

Если окажется, что критический участок распространяется на весь метод, то можно указать ключевое слово synchronized в объявлении метода

synchronized void myMethod( ) {. . .}

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