6 различий между методами wait() и sleep() в Java
Источник:
Medium
Хотя и метод wait(), и метод sleep() можно использовать для приостановки потока, между ними существует разница, о которой вы узнаете, прочитав эту статью.
Если у вас уже был опыт прохождения собеседования по Java, то вы наверняка знаете, что разница между методами
wait() и
sleep() заключается в том, что оба этих метода используются для приостановки работающего потока (running thread). Однако между ними есть тонкая разница, которую нужно понимать.
Когда поток вызывает
wait() для объекта, то он переходит в неопределенное состояние ожидания, пока другой поток не вызовет для этого объекта
notify() или
notifyAll(). Именно так
wait и
notify используются для связи между потоками в Java.
Если же никто не вызовет
notify, то состояние ожидания продолжится, пока программа не будет закрыта.
Что касается метода
sleep(), то он может использоваться для конечного ожидания (finite waiting). Например, вы можете использовать метод
sleep(), чтобы приостановить поток на определенное время, например, подождать 5 секунд, прежде чем повторить попытку доступа к микросервису. Иными словами,
sleep() — это самый простой способ перевести поток в спящий режим на ограниченное время, в то время как
wait() — это более сложный способ взаимодействия между потоками в Java.
Теперь, когда вы знаете основной принцип работы
wait() и
sleep(), пришло время погрузиться немного глубже и понять более детальные различия между ними.
Разница между wait() и sleep() в многопоточности Java
Вот некоторые важные различия между этими двумя методами, широко используемыми в Java Multithreading:
1. Синхронизированный контекст
Метод
wait() должен вызываться из синхронизированного контекста (может быть синхронизированным блоком или методом), тогда как метод
sleep() может быть вызван из синхронизированного блока без него.
2. Снятие блокировки
Когда вы вызываете метод
wait(), поток снимает блокировку, которую он удерживал. А вот после вызова метода
sleep() поток продолжает удерживать блокировку.
3. Местоположение
Метод
wait() определен в классе
java.lang.Object, тогда как метод
sleep() определен в классе
java.lang.Thread.
4. Пробуждение
Поток, вызвавший
wait(), может быть разбужен (woken up) другими потоками с помощью вызова методов
notify() и
notifyAll(). При этом спящий поток не может быть разбужен другим потоком до истечения времени ожидания, но другой поток всегда может прервать спящий поток.
5. Различия в вызове
Самое важное различие между методами
wait() и
sleep() заключается в том, что вы вызываете
wait() для объектов, то есть монитора, а метод
sleep() вызывается для
Thread.
6. Состояние
После вызова метода
wait() поток переходит в состояние
WAITING, а после вызова метода
sleep() поток переходит в состояние
TIMED_WAITING.
Заключение
В перечисленных выше причинах и заключается разница между методами
wait() и
sleep() в Java. Как я уже сказал,
sleep() — это самый простой способ перевести поток в спящий режим на ограниченное время, тогда как
wait() — это более сложный способ взаимодействия между потоками в Java.
Как правильно использовать List в Java
Источник:
FreeCodeCamp
Из этой статьи вы узнаете, как расширить и реализовать интерфейс List в Java и как взаимодействовать с элементами в коллекции.
Интерфейс Java
List можно использовать для хранения объектов/элементов в упорядоченной коллекции. Он расширяет интерфейс
Collection.
Интерфейс
List предоставляет нам различные методы для вставки, доступа и удаления элементов в коллекции.
Классы реализации интерфейса Java List
Существует несколько классов реализации интерфейса
List в Java:
- AbstractList
- AbstractSequentialList
- ArrayList
- AttributeList
- CopyOnWriteArrayList
- LinkedList
- RoleList
- RoleUnresolvedList
- Stack
- Vector
Наиболее часто используемой реализацией интерфейса
List являются
ArrayList и
LinkedList. Поскольку оба этих класса реализуют интерфейс
List, они используют одни и те же методы для добавления, доступа, обновления и удаления элементов в коллекции.
Сейчас мы рассмотрим, как можно добавлять, получать доступ, обновлять и удалять элементы в коллекции с помощью
ArrayList.
Как реализовать List в Java с помощью ArrayList
В отличие от массивов, которые в Java имеют заданный размер,
ArrayList более динамичен, когда речь идет о хранении элементов. Это означает, что вы можете добавлять элементы по своему усмотрению.
Вот как вы можете создать
ArrayList:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> students = new ArrayList<String>();
}
}
В этом коде мы сначала импортировали класс
ArrayList:
import java.util.ArrayList;.
Затем мы создали новый объект
ArrayList с названием
students: ArrayList<String> students = new ArrayList<String>();.
Обратите внимание, что типы данных элементов, которые будут храниться в
ArrayList, были указаны в угловых скобках:
<String>.
Как добавить элементы в ArrayList
Для добавления элементов в
ArrayList вы можете использовать метод
add(). Вот пример:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> students = new ArrayList<String>();
students.add("John");
students.add("Jane");
students.add("Doe");
System.out.println(students);
// [John, Jane, Doe]
}
}
В приведенном выше коде мы передали элемент для добавления в
ArrayList качестве параметра:
students.add("Doe").
Как получить доступ к элементам в ArrayList
Для получения доступа к элементам в
ArrayList следует использовать метод
get().
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> students = new ArrayList<String>();
students.add("John");
students.add("Jane");
students.add("Doe");
System.out.println(students.get(1));
// Jane
}
}
Как видите, мы передали индекс элемента, к которому нужно получить доступ, в качестве параметра метода
get():
students.get(1).
Как обновить элементы в ArrayList
Чтобы обновить значение элементов в
ArrayList, нужно использовать метод
set(). Он принимает два параметра: индекс обновляемого элемента и новое значение. Вот пример:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> students = new ArrayList<String>();
students.add("John");
students.add("Jane");
students.add("Doe");
students.set(2,"Jade");
System.out.println(students);
// [John, Jane, Jade]
}
}
Как удалить элементы в ArrayList
Чтобы удалить элементы в
ArrayList, следует использовать метод
remove(). Мы также используем индекс, чтобы указать, какой элемент удалить.
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> students = new ArrayList<String>();
students.add("John");
students.add("Jane");
students.add("Doe");
students.remove(2);
System.out.println(students);
// [John, Jane]
}
}
Если же вам нужно удалить все элементы в коллекции, то вы можете использовать метод
clear().
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> students = new ArrayList<String>();
students.add("John");
students.add("Jane");
students.add("Doe");
students.clear();
System.out.println(students);
// []
}
}
Хотя классы
ArrayList и
LinkedList очень похожи, у класса
LinkedList есть несколько дополнительных методов:
- addFirst() — добавляет элемент в начало списка.
- addLast() — добавляет элемент в конец списка.
- getFirst() — возвращает первый элемент списка.
- getLast() — возвращает последний элемент списка.
- removeFirst() — удаляет первый элемент списка.
- removeLast() — удаляет последний элемент списка.
Заключение
В этой статье вы узнали об интерфейсе
List в Java, который используется для хранения упорядоченных коллекций элементов. Также мы рассмотрели некоторые классы реализации интерфейса
List —
ArrayList и
LinkedList.
Используя примеры кода, мы увидели, как добавлять, получать доступ, обновлять и удалять элементы в коллекции с расширением
ArrayList. Хотя
ArrayList и
LinkedList имеют схожие методы, мы выделили некоторые дополнительные методы, которые можно использовать с классом
LinkedList.
Удачного кодирования!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ