android - 03 - multithreading, collections
TRANSCRIPT
Noveo Summer School
Лекция 3. Коллекции, многопоточность.
Коллекции2
Коллекции
Коллекции3
Списки
Список — упорядоченная последовательность, которая может содержать повторы. Дополняет интерфейс Collection операциями, характерными для линейной структуры (поиск индекса, обращение к элементу по индексу, взятие подсписка).
Коллекции4
СпискиРеализации в Java
• LinkedList<E> — на основе двусвязного списка, нужно применять, когда много операций вставки в начало или середину списка.
• ArrayList<E> — на основе массива, эффективен при частых обращениях к элементам с произвольным индексом.
• Vector<E> — старая реализация, тот же ArrayList<E>, но потокобезопасный. Почти не используется.
Коллекции5
Множества
Множество – набор неповторяющихся элементов.• HashSet<E> – множество на основе
Hash-таблицы.• LinkedHashSet<E> – множество на
основе Hash-таблицы и двусвязного списка.
• TreeSet<E> – множество на основе красно-черного дерева (использует Comparable или Comparator).
Коллекции6
Очереди
Queue<E> и Deque<E> — реализуют однонаправленную и двунаправленную очереди. LinkedList является одной из реализаций.• offer• poll• peek
Коллекции7
Словари (Maps)
Map – множество пар ключ-значение.• HashMap<K,V> – основана на
Hash-таблице, не может содержать null в качестве ключей или значений.
• TreeMap<K,V> - основана на красно-черном дереве. Log(n) трудоемкость.
• Hashtable<K,V> - устаревшая реализация, использовать НЕ НАДО.
Коллекции8
Iterator
Iterator – объект, который позволяет последовательно проходить элементы коллекции.
List<String> list = new LinkedList<String>();list.add("first");list.add("second");
Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {
String next = iterator.next();System.out.println(next);
}
Коллекции9
ListIterator
ListIterator – интерфейса-наследник Iterator, позволяет проходить по элементам списка как в прямом, так и в обратном направлении.
Boolean hasNext();E next();
Boolean hasPrevious();E previous();
Коллекции10
Collections
Collections – класс, содержащий набор вспомогательных статических методов.Например:sort(List<T> list);swap(List<T>, int I, int j);reverse(List<?> list);fill(List<? super T>, T obj);
11
МногопоточностьКак запустить код в другом потоке
public class MyRunnable implements Runnable {@Overridepublic void run() {
System.out.println(“Hello World”);}
}
Использование:Thread thread = new Thread(new MyRunnable());thread.start();
Многопоточность
12
МногопоточностьКак запустить код в другом потоке
public class MyThread extends Thread {@OverridePublic void run() {
System.out.println(“Hello world”);}
};
Использование:Thread thread = new MyThread();thread.start();
Многопоточность
13
МногопоточностьSleep & interrupt
public class MyRunnable implements Runnable {@Overridepublic void run() {
try {for (int I = 0; I < 10; i++) {
Thread.sleep(2000);System.out.println(“Hello World”);
}} catch(InterruptedException e) {
System.out.println(“Thread has been interrupted”);}
}}
ИспользованиеThread thread = new Thread(new MyRunnable());thread.start();thread.interrupt();
Многопоточность
14
МногопоточностьJoin
public class MyRunnable implements Runnable {@Overridepublic void run() {
for (int I = 0; I < 10; i++) {System.out.println(“Hello World”);}
}}
Использование:Thread thread = new Thread(new MyRunnable());thread.start();thread.join();
Многопоточность
15
МногопоточностьПроблема синхронизации
public class Counter {
private int counter = 0;
public void decrement() {counter--;
}
public void increment() {counter++;
}
}Многопоточность
16
МногопоточностьSynchronized
public class Counter {
private int counter = 0;
public synchronized void decrement() {counter--;
}
public void increment() {synchronized (this) { counter++;}
}
}
Многопоточность
17
МногопоточностьWait, notify, notifyAll
public class Box {private boolean empty = true;
public synchronized void get() {while(empty) {
try{wait();
} catch(InterruptedException e){}}//do something importantempty = true;notifyAll();
}}
Многопоточность
18
МногопоточностьWait, notify, notifyAll
…public synchronized void put() {
while(!empty) {try{
wait();} catch(InterruptedException e){}
}//do something importantempty = false;notifyAll();
}
Многопоточность
19
Многопоточностьjava.util.concurrent
• Lock objects• Executors• Concurrent collections• Atomic variables
Многопоточность
Материалы20
Материалы
По коллекциям:• Oracle Tutorial:
http://docs.oracle.com/javase/tutorial/collections/index.html
• Just Java: глава 16.
По многопоточности:• Oracle Tutorial:
http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html
• Just Java: главы 13, 14
Практическое задание21
Практическое задание
Необходимо реализовать классическую задачу потребителей/производителей.
Суть задачи:Существует некоторый буфер, который доступен из двух потоков, буфер может содержать максимум 5 элементов. Один поток (производитель) способен добавлять значения в буфер, другой поток(потребитель) извлекать их из него. Необходимо реализовать такое взаимодействие упомянутых потоков, при котором потребитель будет осуществлять попытку извлечения только в случае, если в буфере есть хотя бы один элемент, а производитель будет записывать значение в буфер, только если в нем менее 5 элементов.