SlideShare a Scribd company logo
Многопоточное
программирование на Java
Процессы и потоки
Процесс имеет собственную среду исполнения и
собственный выделенный ему набор ресурсов.
JVM выполняется как один процесс.
Потоки (threads) – «легковесные» (lightweight)
процессы, они имеют собственную среду исполнения,
но их создание требует меньше ресурсов. Потоки всегда
существуют внутри процесса, разделяя все его ресурсы.
Каждое Java-приложение состоит как минимум из одного
потока (main thread) и может создавать другие потоки по
мере необходимости.
1
Многопоточное
программирование на Java
Процессы и потоки
Адресное пространство ОС
П

PID 1, Thread 1

Р
О
Ц

П

PID 2, Thread 1
PID 3

PID 3

Thread 2

PID 3 Thread 1

Thread 3

О
Т

Е

PID 4

PID 4

PID 4

О

С

Thread 1

Thread 2

Thread 3

К

С

И

ы
2
Многопоточное
программирование на Java
Главный поток
Все дочерние потоки порождаются из
main thread. Главный поток должен
быть последним в котором
заканчивается выполнение. Когда
главный поток останавливается
программа завершается.

3
Многопоточное
программирование на Java
Создание потоков
Поток в Java – объект класса Thread.
Создать поток можно 2-мя способами:
-

унаследовать класс от Thread

-

реализовать интерфейс Runnable

Второй способ предпочтительнее, т.к.
наследование от Thread запрещает
наличие других суперклассов.

4
Многопоточное
программирование на Java
Создание потоков
public class HelloThread extends Thread
{
public void run()
{
System.out.println("Hello from a thread!");
}
public static void main(String args[ ])
{
(new HelloThread()).start();
}
}

5
Многопоточное
программирование на Java
Создание потоков
public class HelloRunnable implements Runnable
{
public void run()
{
System.out.println("Hello from a thread!");
}
public static void main(String args[ ])
{
(new Thread(new HelloRunnable())).start();
}
}

6
Многопоточное
программирование на Java
Приостановка потоков
public static void main(String args[ ]) throws InterruptedException
{String Info[ ] = { "String 1", "String 2", "String 3", "String 4" };
for (int i = 0; i < Info.length; i++)
{

//Pause for 4 seconds
Thread.sleep(4000);
//Print a message
System.out.println(Info[i]);

}
}
7
Многопоточное
программирование на Java
Прерывание потоков
Метод: public void interrupt()
Реакция на прерывание:
try

if (Thread.interrupted())

{ Thread.sleep(4000);

{

}
catch (InterruptedException e)

return;
}

{ return;
}
Первый вариант работает если в процессе выполнения часто
вызываются методы определенные как … throws InterruptedException,
в противном случае надо использовать второй метод
8
Многопоточное
программирование на Java
Связывание потоков
Метод: public final void join()
Вызывающий поток останавливается и ждет
завершения потока t

Приоритеты потоков
В классе Thread существуют методы
public final int getPriority()
public final void setPriority(int newPriority)
и три константы:
MIN_PRIORITY = 1
MAX_PRIORITY = 10
NORM_PRIORITY = 5
9
Многопоточное
программирование на Java
Синхронизация

public class ThreadTest implements Runnable
{ private static ThreadTest shared = new ThreadTest();
public void process()
{
for (int i=0; i<3; i++)
{System.out.println(Thread.currentThread().getName()+i);
Thread.yield();
}
}

10
Многопоточное
программирование на Java
Синхронизация
public void run()
{
shared.process();
}
public static void main(String s[ ])
{
for (int i=0; i<3; i++)
{
new Thread(new ThreadTest(), "Thread-"+i).start();
}
}
}
11
Многопоточное
программирование на Java
Синхронизация
Пример вывода:
Thread-0 0
Thread-1 0
Thread-2 0
Thread-0 1
Thread-2 1
Thread-0 2
Thread-1 1
Thread-2 2
Thread-1 2

12
Многопоточное
программирование на Java
Синхронизация
public void run()
{
synchronized (shared)
{
shared.process();
}
}
public static void main(String s[ ])
{
for (int i=0; i<3; i++)
{
new Thread(new ThreadTest(), "Thread-"+i).start();
}
}
}
13
Многопоточное
программирование на Java
Синхронизация
Пример вывода:
Thread-0 0
Thread-0 1
Thread-0 2
Thread-1 0
Thread-1 1
Thread-1 2
Thread-2 0
Thread-2 1
Thread-2 2

14
Многопоточное
программирование на Java
Синхронизация
Synchronized-методы работают аналогичным образом.
Прежде, чем начать выполнять их, поток пытается
заблокировать объект, у которого вызывается метод.
После выполнения блокировка снимается.
public class ThreadTest implements Runnable
{ private static ThreadTest shared = new ThreadTest();
public void synchronized process()
{
for (int i=0; i<3; i++)
{System.out.println(Thread.currentThread().getName()+i);
Thread.yield();
}
}
}
15
Многопоточное
программирование на Java
Синхронизация
Также допустимы методы static synchronized. При
их вызове блокировка устанавливается на объект
класса Class, отвечающего за тип, у которого
вызывается этот метод.

16
Многопоточное
программирование на Java
Тупики (deadlocks)
public class DeadlockDemo
{public final static Object one=new Object(), two=new Object();
public static void main(String s[ ]) {
Thread t1 = new Thread()
{ public void run()
{synchronized(one)
{Thread.yield();
synchronized (two) {System.out.println("Success!"); }
}
}
};

17
Многопоточное
программирование на Java
Тупики (deadlocks)
Thread t2 = new Thread()
{public void run()
{synchronized(two)
{Thread.yield();
synchronized (one) {System.out.println("Success!"); }
}
}
};
t1.start(); t2.start();
}
}

18
Многопоточное
программирование на Java
Wait-set методы
Каждый объект в Java имеет не только блокировку для
synchronized блоков и методов, но и так называемый waitset, набор потоков исполнения. Любой поток может вызвать
метод wait() любого объекта и таким образом попасть в его
wait-set. При этом выполнение такого потока
приостанавливается до тех пор, пока другой поток не
вызовет у этого же объекта метод notifyAll(), который
пробуждает все потоки из wait-set. Метод notify() пробуждает
один случайно выбранный поток из данного набора.
19
Многопоточное
программирование на Java
Wait-set методы
Однако применение этих методов связано с одним важным
ограничением. Любой из них может быть вызван потоком у
объекта только после установления блокировки на этот
объект. То есть либо внутри synchronized-блока с ссылкой
на этот объект в качестве аргумента, либо обращения к
методам должны быть в синхронизированных методах
класса самого объекта.

20
Многопоточное
программирование на Java
Wait-set методы
public class WaitThread implements Runnable
{ private Object shared;
public WaitThread(Object o)
{ shared=o;}
public void run()
{ synchronized (shared) {
try { shared.wait(); } catch (InterruptedException e) {}
System.out.println("after wait");
}
}
21
Многопоточное
программирование на Java
Wait-set методы
public static void main(String s[])
{Object o = new Object();
WaitThread w = new WaitThread(o);
new Thread(w).start();
try { Thread.sleep(100); } catch (InterruptedException e) {}
System.out.println("before notify");
synchronized (o) { o.notifyAll(); }
}
}
22
Многопоточное
программирование на Java
Wait-set методы
Вывод программы:
before notify
after wait

23

More Related Content

Similar to 8. java lecture threads (20)

PPT
Java. Lecture 08. Multithreaded Programming
colriot
 
PPTX
javaaaaddawdawdawdasdsadsaddadadm11n.pptx
ssuserb46e0b
 
PPTX
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Fedor Lavrentyev
 
PPT
Java. Многопоточность.
Unguryan Vitaliy
 
PDF
Java осень 2013 лекция 2
Technopark
 
PDF
Java весна 2014 лекция 5
Technopark
 
PDF
Lecture1: Introduction to Parallel Computing
Andrii Rodionov
 
PPTX
Expert Java Day: Java concurrency
Pavel Titkov
 
PDF
11 - Java. Многопоточность в Java: средства стандартной библиотеки
Roman Brovko
 
PDF
10 - Java. Многопоточность в Java: основы
Roman Brovko
 
PPTX
Step 7
DmitryTrushkin
 
PDF
Atomics, CAS and Nonblocking algorithms
Alexey Fyodorov
 
PDF
Курс Java-2016. Занятие 08. Итераторы, многопоточность
7bits
 
PPTX
Java Core. Lecture# 1. Intro
Anton Moiseenko
 
PDF
Синхронизация без блокировок и СМС
Alexey Fyodorov
 
PPTX
Android - 03 - Multithreading, Collections
Noveo
 
PDF
Thread
Alexander Rusin
 
PPTX
Java Core. Lecture# 3. Part# 3. Multithreading.
Anton Moiseenko
 
PPTX
Programming Java - Lection 01 - Basics - Lavrentyev Fedor
Fedor Lavrentyev
 
PPTX
Multithreading in java past and actual
Yevgen Levik
 
Java. Lecture 08. Multithreaded Programming
colriot
 
javaaaaddawdawdawdasdsadsaddadadm11n.pptx
ssuserb46e0b
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Fedor Lavrentyev
 
Java. Многопоточность.
Unguryan Vitaliy
 
Java осень 2013 лекция 2
Technopark
 
Java весна 2014 лекция 5
Technopark
 
Lecture1: Introduction to Parallel Computing
Andrii Rodionov
 
Expert Java Day: Java concurrency
Pavel Titkov
 
11 - Java. Многопоточность в Java: средства стандартной библиотеки
Roman Brovko
 
10 - Java. Многопоточность в Java: основы
Roman Brovko
 
Atomics, CAS and Nonblocking algorithms
Alexey Fyodorov
 
Курс Java-2016. Занятие 08. Итераторы, многопоточность
7bits
 
Java Core. Lecture# 1. Intro
Anton Moiseenko
 
Синхронизация без блокировок и СМС
Alexey Fyodorov
 
Android - 03 - Multithreading, Collections
Noveo
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Anton Moiseenko
 
Programming Java - Lection 01 - Basics - Lavrentyev Fedor
Fedor Lavrentyev
 
Multithreading in java past and actual
Yevgen Levik
 

More from MERA_school (6)

PPT
2. java lecture syntax
MERA_school
 
PPT
7. java lecture events
MERA_school
 
PPT
6. java lecture swing
MERA_school
 
PPT
5. java lecture io
MERA_school
 
PPT
4. java lecture exceptions
MERA_school
 
PPT
1. java lecture intro
MERA_school
 
2. java lecture syntax
MERA_school
 
7. java lecture events
MERA_school
 
6. java lecture swing
MERA_school
 
5. java lecture io
MERA_school
 
4. java lecture exceptions
MERA_school
 
1. java lecture intro
MERA_school
 
Ad

8. java lecture threads