Есть два варианта создания потока:
1) Наследовать класс Thread и перегрузить ему метод run.
2) Реализовать интерфейс Runnable, а потом воспользоваться конструктором класса Thread для создания нового потока:
Thread th = new Thread(new MyRunableImp(), "MyThreadName");Потоки можно размещать в группы, а потом получать активные потоки группы:
ThreadGroup tg = new ThreadGroup("NameThreadGroup"); Thread thread = new Thread(tg, newMyRunableImp(), "ThreadName"); Thread thread1 = new Thread(tg, newMyRunableImp(), "ThreadName2"); Thread thread2 = new Thread(tg, newMyRunableImp(), "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);
Комментариев нет:
Отправить комментарий