1. В чем разница между потоком и процессом?
- Адресное пространство:Потоки одного и того же процесса совместно используют адресное пространство процесса, а сам процесс является независимым адресным пространством.
- На ресурсе есть:Потоки в одном процессе совместно используют ресурсы процесса, такие как память, ввод-вывод, процессор и т. д., но ресурсы между процессами независимы.
- Надежность:После сбоя процесса он не повлияет на другие процессы в защищенном режиме, но если происходит сбой потока, весь процесс умирает. Таким образом, многопроцессорность более надежна, чем многопоточность.
- представление:Когда процесс переключается, потребление ресурсов велико, а эффективность высока. Поэтому, когда дело доходит до частого переключения, лучше использовать потоки, чем процессы. Точно так же, если параллельные операции должны выполняться в одно и то же время, а некоторые переменные должны быть общими, можно использовать только потоки, а не процессы.
- Процесс реализации:Каждый независимый процесс имеет запись выполнения программы, последовательную последовательность выполнения и запись программы. Однако потоки не могут выполняться независимо и должны зависеть от прикладной программы, а прикладная программа обеспечивает управление выполнением нескольких потоков.
- Основные отличия:Поток — это основная единица планирования процессора, а процесс — нет.
2. Поток и работающий
- Подходит для нескольких потоков одного и того же программного кода для обработки одного и того же ресурса
- Ограничения одиночного наследования в java можно избежать.
- Увеличьте надежность программы, код может совместно использоваться несколькими потоками, код и данные независимы.
3. Возвращаемое значение потока
- основной поток ожидает
- Метод соединения потока
- Вызываемый интерфейс: FutureTask или приобретение пула потоков
Реализация вызываемого интерфейса:
import java.util.concurrent.Callable;
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception{
String value="test";
System.out.println("Ready to work");
Thread.currentThread().sleep(5000);
System.out.println("task done");
return value;
}
}
- БудущееЗадание:
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class FutureTaskDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> task = new FutureTask<String>(new MyCallable());
new Thread(task).start();
if(!task.isDone()){
System.out.println("task has not finished, please wait!");
}
System.out.println("task return: " + task.get());
}
}
- Получение пула потоков
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ThreadPoolDemo {
public static void main(String[] args) {
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
Future<String> future = newCachedThreadPool.submit(new MyCallable());
if(!future.isDone()){
System.out.println("task has not finished, please wait!");
}
try {
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} finally {
newCachedThreadPool.shutdown();
}
}
}
4. Статус потока
- New
- Runnable
- Waiting
- Timed Waiting
- Blocked
- Terminated
5. Спать и ждать?
- сон не освобождает блокировку, ожидание освобождает объект
- sleep — метод Thread, wait — метод Object.
6. Блокировать пул и ждать пул?
- блокировка пула:Предполагая, что поток A уже владеет блокировкой объекта, поскольку B и C хотят вызвать синхронизированный метод этого объекта, объекты B и C войдут в пул блокировок.
- пул ожидания:После того, как поток A вызывает wait(), A снимает блокировку с объекта и входит в пул ожидания для объекта.
7. уведомить и уведомить всех?
- notifyAll позволит всем потокам, ожидающим в пуле, войти в пул блокировок, чтобы конкурировать за возможности блокировки.
- уведомление заключается в случайном выборе одного
8. yield означает выпуск процессора
9. функция прерывания
- Заброшенная функция: стоп
- Прерывание должно уведомить поток о том, что его необходимо прервать.Если поток заблокирован, поток выдаст InterruptedException
- Установите флаг в значение true, если поток активен. Прерванный поток будет продолжать выполняться без изменений.
10. Переходы между состояниями потока
synchronized
блокировка объекта
- это в синхронизированном блоке
- Синхронизация нестатических методов
блокировка класса
- Блок синхронизированного кода class.class
- Синхронизированный статический метод
возвращающийся
Тот же объект входит в тот же ресурс
Спин-блокировки и адаптивные спин-блокировки
- Блокировка вращения: позволяя потоку выполнять цикл занятости и ждать освобождения блокировки, не отказываясь от процессора (чем дольше блокировка занята, тем больше потребляется производительность, поэтому будет ограничение на количество вращений. )
- Адаптивная блокировка вращения: установить количество раз самостоятельного выбора непросто, и адаптивная блокировка вращения будет решать, вращать или нет в соответствии с последним временем вращения.
Снятие блокировки:
Определяйте контекст и удаляйте блокировки, которые вряд ли будут оспариваться
блокировка огрубления
Благодаря диапазону блокировки повторная блокировка и разблокировка уменьшаются.
Четыре состояния синхронизированы
Направление расширения блокировки: нет блокировки --> смещенная блокировка --> облегченная блокировка --> усиленная блокировка.
- Предвзятая блокировка: если поток получает блокировку, блокировка переходит в режим смещения, что может сохранить операцию применения блокировки.
- Облегченная блокировка: альтернативное выполнение потока
- Тяжелый замок:
Семантика памяти замков
- Освобождение блокировки: модель памяти Java сбрасывает локальные переменные, соответствующие потоку, в основную память.
- Получение блокировки: локальная память, соответствующая потоку, будет аннулирована, и критический раздел должен прочитать общую переменную из основной памяти.
Разница между sycronized и ReentryLock
- Справедливая блокировка: порядок получения блокировок соответствует порядку последовательного вызова метода блокировки.
- Несправедливые блокировки: преимущественный порядок не обязательно
happens-before
- порядок программы
- запирание
- volatile
- перечислить
- начало потока
- прерывание потока
- завершение потока
- завершение объекта
Пессимистическая блокировка и оптимистичная блокировка
- Пессимистическая блокировка всегда предполагает конфликт
- Оптимистическая блокировка обнаруживается только при отправке данных (CAS, J.U.C)