Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

9.3. Потоки в Java

В виду особой роли потоков в функционировании программ отноше-

ние к ним в языке Java особое, и введённые ограничения несколько услож-

няют создание и применение потоков. В языке Java в отличие от созданного

позднее языка C# отсутствуют делегаты, и, разумеется, нет специального по-

токового делегата, позволяющего задать потоковую функцию с любым име-

нем. Язык Java использует специальную предопределённую потоковую

функцию с именем runO, которую обязан применить любой поток. Также в

языке Java появляются неудобства, связанные с созданием и применением

объектов потоков. Если в языке C# объекты потока типа Thread можно соз-

дать так, как создаются любые управляемые объекты, то на языке Java воз-

никает ряд ограничений. Они связаны не только с функцией run(), но и с на-

следованием. Класс может создать поток только в том случае, если он насле-

дует либо класс Thread, либо интерфейс Runnable, содержащий функцию

run(). Запуск потока осуществляет функция start(), а для задержки его выпол-

нения применяется функция sleep(). Если в языке C# не запрещают, но пре-

дупреждают об опасности применения функции Suspend() приостановки по-

тока и функции Resume() возобновления потока класса Thread, то e Java

функции suspendO и resumeO запрещены. Поэтому появляются проблемы,

если, действительно, требуется приостановить или возобновить выполнение

некоторого потока. Как эта проблема разрешена при разработке многопоточ-

ной программы, смотрите в разделах 11 и 9.6.2. А сейчас взгляните и поста-

райтесь понять разные варианты создания и применения потоков в програм-

мах примера9.3.1.

Класс имеет много перегруженных конструкторов, среди которых мы

выделим

public Thread ( ) // вариант 1

publlcThread(Runnable runnable) //вариант2

где runnable - интерфейсная ссылка на объект, наследующий интерфейс

Runnable и содержащий потоковую функцию run().

Использование этих конструкторов поясняет пример 9.3.1.

Пример 9.3.1. Два параллельно выполняющихся потоковых объекта на

языке Java.

////////////////////

// Java и J# Версия 1

class CThread extends Thread // Класс потокового объекта

{

private int num;

private boolean life;

// Номер потокового объекта

// Признак жизни потока

public CThread (int Num ) {num= Num; life= true;>

public void Finish ( ) {life= false;>;

public void run ( )

{

// Выполнить поток

int n= 0;

while (life)

{

// Номер цикла потока

// Пока живём, выполнять:

System.out.println ("thread " + num + " n= " + n);

n++;

try

Thread.sleep (50);

>

catch (InterruptedExceptlon e)<>

>

System.out.println ("Thread " + num + " finished");

>

>

class TestThread

i

public static void main ()

{

CThread threadl= new CThread (1); // Создать первый объект

CThread thread2= new CThread (2); // Создать второй объект

threadl.start ( ); // Стартовать первый потоковый объект

thread2.start ( ); // Стартовать второй потоковый объект

try

{

Thread.sleep (100); // Поспать 100 мс

>

catch(InterruptedException e){>

threadl,Finlsh ( ); // Завершить первый потоковый объект

thread2.Finish ( ); // Завершить второй потоковый объект

////////////////////

// Java и J# Версия 2

class CThread implements Runnable // Класс потока

{

lnt num; // Номер потокового объекта

boolean life; // Признак жизни потока

public Thread thr;

public CThread (lnt Num )

<

num= Num; life= true;

thr= new Thread (this);

>

public void Flnlsh ( ) {life= false;>;

public void run ( ) // Выполнить поток

{

int n= 0; // Номер цикла потока

while (life) // Пока живём, выполнять

{

System.out.println ("thread " + num + " n= " + n);

n++;

try

{

Thread.sleep (50);

catch(InterruptedExceptlon e){}

>

System.out.println ("Thread " + num + " finished");

>

>

class TestThread

{

public static void main ( )

{

CThread cThreadl= new CThread (1); // Создать первый объекте потоком

CThread cThread2= new CThread (2); // Создать второй объект с потоком

cThreadl.thr.start ( ); // Стартовать первый потоковый объект

cThread2.thr.start ( ); // Стартовать второй потоковый объект

try

{

Thread.sleep (100); // Поспать 100 мс

>

catch(InterruptedException e){>

cThreadl.Finlsh ( ); // Завершить первый потоковый объект

cThread2,Finish ( ); // Завершить второй потоковый объект

>

>

////////////////////

// Java и J# Версия 3

class CThread implements Runnable // Класс потока

{