вторник, 19 октября 2010 г.

Параллельное программирование в java

Для этих целей существует класс Thread.

Есть два варианта создания потока:
1) Наследовать класс Thread и перегрузить ему метод run.
2) Реализовать интерфейс Runnable, а потом воспользоваться конструктором класса Thread для создания нового потока:

Thread th = new Thread(new MyRunableImp(), "MyThreadName");



Потоки можно размещать в группы, а потом получать активные потоки группы:

ThreadGroup tg = new ThreadGroup("NameThreadGroup");
Thread thread = new Thread(tg, new MyRunableImp(), "ThreadName");
Thread thread1 = new Thread(tg, new MyRunableImp(), "ThreadName2");
Thread thread2 = new Thread(tg, new MyRunableImp(), "ThreadName3")

Активные - это те, у которых был вызван метод start()[именно он вызывает run()]

Thread[] threads = new Thread[tg.activeCount()];
int count = tg.enumerate(threads); // заполняется массив обьектами активных потоков

Приоритеты потоков:
 MIN_PRIORITY = 1
 NORM_PRIORITY = 5
 MAX_PRIORITY =10
По-умолчанию каждый поток получает нормальный приоритет.
Приоритеты можно менять:

thread.setPriority(Thread.MIN_PRIORITY + 2);

Потоки демоны характеризируются тем, что когда основной поток приложения завершился, то он не дожидается завершения демонов, а терминирует их. Чтобы поток стал демоном нужно до старта поставить ему флаг:

FirstThread thread = new FirstThread();
thread.setDeamon(true);
thread.start();

Мониторы и синхронизация
Монитор - жезл власти потока, тот кто им владеет может пользоваться процессорным временем в этот момент.
В Яве это блок кода synchronized(){}. Если в методе класса есть такой блок (или весь метод), то инстация этого класса может выполнять этот блок тогда, когда другая инстанция не выполняят этот блок кода в этот момент. То есть это метод блокировки ресурса. Чтобы в таком блоке сделать паузу и передать управление другой инстанции нужно сделать вызов this.wait(). И эта инстанция будет висеть до тех пор пока ей не сделают this.notify()[notifyAll()] - первый сообщить первому на очереди, второй сообщить всем.

Семафор - это первая реализация синхронизации, процесс "занятия и освобождения рессурса". В Яве это реализуется by java.util.concurrent.

Работающие паралельно потоки можно обрывать из главного потока by thread.interrapt();

Если процесс печется о других, понимая, что его поточные задачи могут подождать, то тогда можна вызвать следующее Thread.yeild(), это передаст страждущим процессорное время.

Процесс может поспать конкрекретное время this.sleep(10000);

Комментариев нет:

Отправить комментарий