Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Создание нового потока




Организация потоков

Диапазон приоритетов потоков определяется: MIN_PRIORITY – 1 и MAX_PRIORITY – 10. По умолчанию приоритет потока равен 5. При запуске main-функции её приоритет по умолчанию равен 5.

Один из потоков (главный или родительский) начинает выполняться первым при запуске Java-программы. От главного потока определяются дочерние потоки. Главный поток начинает выполняться первым и заканчивает выполнятся последним. Программа завершается, когда главный поток останавливается.

Поток может быть создан на основе базового класса Thread или реализации интерфейса Runnable. Класс Thread инкапсулирует ряд методов, которые помогают управлять потоками. Главный поток создаётся автоматически с именем main и приоритетом 5 по умолчанию. Им можно управлять через объект класса Thread. Ссылку на него можно получить, используя статический метод:

 

static currentThread().

 

Пример:

 

Thread th = Thread.currentThread(); /*возвращает ссылку на

поток, в котором он вызывается. В

дальнейшем эту объектную ссылку

можно использовать для вызова

методов управления потоками */

 

Самый простой способ создания потока – это реализация интерфейса Runnable, внутри которого определен единственный метод: public void run(). При создании потока (при реализации интерфейса Runnable) в классе требуется реализация метода run():

 

class A implements Runnable

{ ….

run();

……}

 

Пример: класс, реализующий многопоточность

 

class NewThread implements Runnable

{Thread t;

NewThread (); //конструктор для создания нового потока

{ t = new Thread(this, “DemoThread”);

System.out.println(“Дочерний поток ”+t);

t.start(); //стартовать поток

}

public void run()

{ try { for(int i=3; i>0; i--)

{ System.out.println(“Дочерний поток: ”+i);

Thread.sleep(500); //приостановить поток на 500 мс

}

}

catch(Exception e)

{ System.out.println(“Прерывание дочернего потока”);}

System.out.println(“Завершение дочернего потока ”);

} }

//головная программа

class ThreadDemo

{ public static void main(String args[])

{ new NewThread ();

try { for(int i=3; i>0; i--)

{ System.out.println(“Главный поток “);

Thread.sleep(500);

}

}

catch(Exception e)

{ System.out.println(“Прерывание главного потока”);}

System.out.println(“Завершение главного потока ”);

} }

 

Вывод программы:

Дочерний поток: Thread [DemoThread, 5, main]

Главный поток 3

Дочерний поток 3

Дочерний поток 2

Главный поток 2

Дочерний поток 1

Завершение дочернего потока

Главный поток 1

Завершение главного потока

За счет расчета величины паузы 1000 и 500 мс обеспечивается завершение главного потока после дочернего.

Синхронизация предназначена для разграничения и упорядочивания доступа нескольких потоков к разделяемому ресурсу (напр., таблица БД, файл, статическая переменная).

Обычно в языках программирования распараллеливание и синхронизация реализуется программированием цикла событий и опросом некоторых разделяемых переменных на выполнение какого-то условия, на что теряется время процессора.

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

1) синхронизация метода – если критическим участком является метод, то можно просто указать ключевое слово synchronized.

Пример:

 

synchronized void myMethod()

{……}

или

void myMethod()

{ synchronized(this)

{…….}

}

 

2)синхронизация объекта – если нет доступа к классу, в котором объявлен метод, то для его синхронизации можно использовать следующий приём:

 

synchronized(Object)

{ //операторы критического участка, в том числе и вызовы метода

}

 

Здесь Object – ссылка на объект, который нужно синхронизировать, то есть объект, элементом которого является вызываемый метод.

Если какой-либо из потоков начнет выполнять участок кода, определенный как synchronized, то для других потоков этот участок будет заблокирован до освобождения его первым потоком.

 

 




Поделиться с друзьями:


Дата добавления: 2014-12-25; Просмотров: 385; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.