Программирование на языке Java. Уровень 3. Разработка клиент – серверных приложений 40 ак.час.
О преподавателе
Программа курса
Создание и управление потоками java.lang.Thread модуль 1
The Thread Class
Создание потока
Создание потока (второй способ)
Анонимный класс
Ожидание завершения потока
Завершение потока
Interrupt a Thread
Наблюдение за состоянием потока getState()
Наблюдение за состоянием потока getState()
Локальная память потока
Синхронизация потоков
Взаимодействие потоков
Группы потоков
Высокоуровневые блокировки
392.50K
Категория: ПрограммированиеПрограммирование

Threads

1. Программирование на языке Java. Уровень 3. Разработка клиент – серверных приложений 40 ак.час.

2. О преподавателе

Окончил
и работал на кафедре РК-5
МГТУ им. Н. Э. Баумана
Разработчик и преподаватель курсов по
C/C++, Java, C#, R, Scala
Выпустил
более
500
групп
по
различным продуктам Oracle, Microsoft и
авторским курсам
Александр Кораблин
Преподаватель УЦ
Более 25 лет преподает курсы по IT
технологиям
Специалист
к.т.н., MCT, MCSD,
Oracle Certified
Professional
2

3. Программа курса

Модуль 1. Многопоточное программирование (10 ак. ч.)
Модуль 2. Использование JDBC API в приложениях Java (10 ак.
ч.)
Модуль 3. Stream API (3 ак. ч.)
Модуль 4. Введение в систему модулей (2 ак. ч.)
Модуль 5. Разработка современного пользовательского
интерфейса на JavaFX (10 ак. ч.)
Модуль 6. Основы создания web-приложений на Java (5 ак. ч.)
3

4. Создание и управление потоками java.lang.Thread модуль 1

Александр Кораблин
4

5.

Процессор – отвечает за выполнение
команд. Вопрос: a+b сколько действий?
Процесс – выполняющаяся программа.
Поток(thread) – объект ОС необходимый
для выполнения на процессоре набора
команд.
Ядро процессора выполняет один поток в
один момент времени.
5

6.

модуль 1: Потоки
Плюсы и минусы многопотокового
программирования
6

7. The Thread Class

модуль 1: Потоки
static Thread currentThread( ) Returns a reference to a Thread object that represents the invoking
thread.
long getID( )
Returns a thread’s ID.
final String getName( )
Obtains a thread’s name.
final int getPriority( )
Obtains a thread’s priority.
Thread.State getState( )
Returns the current state of the thread.
static boolean holdsLock(Object о) Returns true if the invoking thread holds the lock on obj.
void interrupt( )
Interrupts a thread.
static boolean interrupted( )
Returns true if the invoking thread has been interrupted.
final boolean isAlive( )
Determines whether a thread is still running.
final boolean isDaemon( )
Returns true if the invoking thread is a daemon thread.
boolean isInterrupted( )
Returns true if the thread on which it is called has been interrupted.
final void join( )
void run( )
final void setDaemon(boolean how)
final void setName(String thrdName)
final void setPriority(int level)
static void sleep(long milliseconds)
void start( )
static void yield( )
Waits for a thread to terminate.
Entry point for the thread.
If how is true, the invoking thread is set to daemon status.
Sets a thread’s name to thrdName.
Sets a thread’s priority to level.
Suspends a thread for a specified period of milliseconds.
Starts a thread by calling its run( ) method.
Yields the CPU to another thread.
7

8. Создание потока

модуль 1: Потоки
class MyThread1 extends Thread {
MyThread1() {
super("name");
…….}
public void run() {
System.out.println("starting…..");
try {
……..}
catch( InterruptedException ex) {
System.out.println("interrupted…..");
}
}}
Class Demo {
public static void main(String args[]) {
System.out.println("Main thread starting....");
MyThread1 thread = new MyThread1();
thread.start();
...................
8

9. Создание потока (второй способ)

модуль 1: Потоки
Создание потока (второй способ)
class MyThread2 implements Runnable {
MyThread2() {
// new Thread(this, "name") . start();
…….}
public void run() {
System.out.println("starting…..");
try {
……..}
catch( InterruptedException ex) {
System.out.println("interrupted…..");
}
}}
Class Demo {
public static void main(String args[]) {
System.out.println("Main thread starting.....");
Thread thread= new Thread(new MyThread2());
thread.start();
...........
9

10. Анонимный класс

модуль 1: Потоки
new Thread()
{
public void run() {
System.out.println("starting…..");
try { ……..}
catch( InterruptedException ex) {
System.out.println("interrupted…..");
}
}
}.start();
// доступ только к полям "final"
10

11. Ожидание завершения потока

модуль 1: Потоки
Ожидание завершения потока
Class Demo {
public static void main(String args[]) {
System.out.println("Main thread starting.....");
Thread thread= new Thread(new MyThread2());
thread.start();
...........
try {
thread.join();
// ждём – нет загрузки CPU
// thread.join(1000);
// while( thread.isAlive()) { ..... }
// загружаем CPU работой
}
catch( InterruptedException ex) {
System.out.println("main interrupted.....");
}
смотреть Demo1
11

12. Завершение потока

модуль 1: Потоки
Завершение потока
return
Daemon thread
Thread thread= new Thread(new MyThread2());
thread.setDaemon(true);
thread.start();
..................
suspend( ), resume( ), stop() - deprecated
interrupt( )
12

13. Interrupt a Thread

модуль 1: Потоки
Пример 1.
создать класс «MyThread» с интерфейсом Runnable
переопределить метод - run()
в этом методе :
– получить имя потока
– реализовать цикл с продолжительной работой
– на каждой итерации проверять состояние потока
– если поток прерван, то завершить цикл
создать класс "Demo"
реализовать метод "main"
13

14. Наблюдение за состоянием потока getState()

модуль 1: Потоки
Наблюдение за состоянием потока
getState()
BLOCKED - The thread is blocked, which means that it is waiting for access to
a synchronized code.
NEW
- The thread has been created, but its start( ) method has not yet been
called.
RUNNABLE - The thread is either currently executing or will execute as soon as it
gets access to the CPU.
TERMINATED - The thread has ended. A thread ends when its run( ) method returns,
or when the thread is stopped via a call to stop( ). (Note that stop( )
is deprecated and should not be used.)
TIMED_WAITING - The thread is suspended, waiting on another thread for a specific
period of time. This can occur because of a call to the timeout
versions of sleep( ), wait( ), or join( ), for example.
WAITING - The thread is suspended, waiting on another thread. This can occur
because of a call to the non-timeout versions of wait( ) or join( ),
for example.
14

15. Наблюдение за состоянием потока getState()

модуль 1: Потоки
Наблюдение за состоянием потока
getState()
New
start()
Terminated
Runnable
interrupt()
wait()
Waiting
Blocked
notify()
notifyAll()
15

16. Локальная память потока

модуль 1: Потоки
Локальная память потока
private static ThreadLocal<Integer> threadLocal =
new ThreadLocal<Integer>()
{
protected Integer initialValue()
{
return new Integer(0);
}
};
смотреть Demo2
16

17. Синхронизация потоков

модуль 1: Потоки
Синхронизация потоков
synchronized type method(arg-list){
// synchronized method body
}
synchronized(objref) {
// synchronized statements
}
Лабораторная 1
17

18. Взаимодействие потоков

модуль 1: Потоки
Взаимодействие потоков
class Test {
boolean ready = false;
synchronized void waitFor() {
try {
while(!ready) wait();
} catch( InterruptedException ex) {
System.out.println("Interrupted…..");
}
}
synchronized void goNow() {
ready = true;
notify();
}}
Лабораторная 2
18

19. Группы потоков

модуль 1: Потоки
Группы потоков
MyThread a = new MyThread();
MyThread b= new MyThread();
ThreadGroup gr = new ThreadGroup("name");
Thread t1= new Thread(gr, a, "Thread #1");
Thread t2= new Thread(gr, b, "Thread #2");
t1.start();
t2.start();
Thread threads[] = new Thread[ gr.activeCount()];
gr.enumerate(threads);
for(Thread t : threads)
System.out.println( t.getName());
gr.interrupt();
19

20.

модуль 1: Потоки
что ещё нужно ….
– читатель/писатель
– код завершения потока
– пул потоков
– проверка доступности ресурса
JDK 1.5
– java.util.concurrent.*;
– java.util.concurrent.locks*;
20

21. Высокоуровневые блокировки

модуль 1: Потоки
Высокоуровневые блокировки
ReentrantLock
• проверка доступности ресурса
• обладает реентерабельностью
• есть честный режим
ReentrantReaderWriterLock
• один писатель/много читателей
StampedLock
• есть оптимистичная блокировка на чтение
• not reentrant!
21

22.

модуль 1: Потоки
Лабораторная 3
ReadWriteLock lock = new ReentrantReadWriteLock();
Lock rl = lock.readLock();
Lock wl = lock.writeLock();
rl.lock(); ............. rl.unlock();
if (rl.tryLock()) { ............. rl.unlock(); }
if (rl.tryLock(5, TimeUnit.SECONDS)) { .............
rl.unlock(); }
22

23.

модуль 1: Потоки
Классы-утилиты для
синхронизации потоков:
• Semaphores
• CountDownLatch
• CyclicBarrier
• Phaser
• Exchanger
23

24.

модуль 1: Потоки
Пулы потоков:
Плюсы
Используемые интерфейсы
• Executor - метод execute(Runnable task)
• ExecutorService – метод submit(Callable task)
• ThreadFactory
Фабрика Executors
24

25.

модуль 1: Потоки
Создание пулов потоков:
Executors.newCachedThreadPool()
• Executors.newSingleThreadExecutor()
Executors.newFixedThreadPool(5)
• Executors.newScheduledThreadPool(2)
… schedule(task,2,TimeUnit.SECONDS)
смотреть Demo3
25

26.

модуль 1: Потоки
Завершение работы пула:
pool.shutdown()
• pool.shutdownNow()
+
pool.awaitTermination(временной интервал)
26

27.

модуль 1: Потоки
Java 7 - Fork/Join Framework
Смотреть ForkJoin
27

28.

модуль 1: Потоки
Новые потокобезопасные коллекции
ConcurrentLinkedDeque 1.7
LinkedBlockingDeque
Случайные числа для одного потока
ThreadLocalRandom
1.7
Атомарные переменные
AtomicInteger , AtomicLong
AtomicIntegerArray ….
Смотреть TimeTest
28

29.

модуль 1: Потоки
Java Memory Model
Видны только в одном потоке:
• локальные переменные
• параметры функций
• параметр catch()
Объекты размещаемые в куче - видны всем
потокам! Это относится и к static.
29

30.

модуль 1: Потоки
А что есть проблемы?
Race condition – доступ к объекту есть у
двух и больше потоков и один из них
выполняет операцию write.
CPU Cache Memory.
• Statement Reordering
https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html
30

31.

модуль 1: Потоки
Гарантии Memory Model
Корректно синхронизированная Java
программа будет правильно работать на всех
процессорных архитектурах.
final – если объект построен “правильно”, то final
поля будут видны другим потокам без
синхронизации.
volatile – данные с этим модификатором не
застревают в кэше и их запрещено
переупорядочивать(reordering).
31

32.

модуль 1: Потоки
Гарантии Memory Model (окончание)
synchronized
• только один поток входит в synchronized блок
• перед захватом монитора локальный кэш
объявляется недействительным, и
следовательно данные будут читаться из
основной памяти
• при освобождении монитора происходит
сбрасывание кэша в основную память
32
English     Русский Правила