Выберите правильное утверждение:
importjava.util.ArrayList,importjava.util.List;publicclassMain(private List<String> stringList = new ArrayList•(;
private void addElemToList 1
synchronized (this) {|
stringList.add("Hello");
private synchronized void addAnotherElemToList) ‹
stringList.add("Hello again");
public static void main(Stringl args) throws InterruptedException !
Main main = new MainD:
Thread t1 = new ThreadO
public void rund {
for (int i = 0; i < 100; i++) {
main.addElemToListO;
main.addAnotherElemToList;
):|
Thread t2 = new Thread 1
public void rund ‹
for (int i = 0; i < 100; i++) {
main.addElemToListO;
main.addAnotherElemToList:
):
ti.start():
t2.start):
t1.join0;
t2.join®;
System.out.printin("List size:" + main.stringList.sizeO):
Другие предметы Университет Многопоточность программирование на Java синхронизация потоков Java ArrayList в Java многопоточность Java университетская программа Java работа с коллекциями Java методы в Java управление потоками Java основы Java обучение программированию Java Новый
В данном коде есть несколько проблем, которые нужно исправить, чтобы он работал корректно. Давайте подробно разберем его и выделим основные моменты.
1. Синтаксические ошибки
2. Структура класса
Класс Main должен быть объявлен правильно, и все методы должны быть оформлены корректно. Например:
public class Main { private List<String> stringList = new ArrayList<>(); private void addElemToList() { synchronized (this) { stringList.add("Hello"); } } private synchronized void addAnotherElemToList() { stringList.add("Hello again"); } public static void main(String[] args) throws InterruptedException { Main main = new Main(); Thread t1 = new Thread() { public void run() { for (int i = 0; i < 100; i++) { main.addElemToList(); main.addAnotherElemToList(); } } }; Thread t2 = new Thread() { public void run() { for (int i = 0; i < 100; i++) { main.addElemToList(); main.addAnotherElemToList(); } } }; t1.start(); t2.start(); t1.join(); t2.join(); System.out.println("List size: " + main.stringList.size()); } }
3. Потокобезопасность
Методы addElemToList
и addAnotherElemToList
используют синхронизацию, что делает их потокобезопасными. Это важно, так как два потока (t1 и t2) будут одновременно добавлять элементы в один и тот же список. Синхронизация гарантирует, что только один поток может выполнять код внутри синхронизированного блока в данный момент времени.
4. Ожидание завершения потоков
Методы join()
используются для того, чтобы основной поток ожидал завершения потоков t1 и t2 перед тем, как продолжить выполнение. Это важно, чтобы гарантировать, что вывод размера списка происходит только после завершения всех добавлений.
5. Вывод результата
В конце программы выводится размер списка, который будет равен 400 (по 200 добавлений от каждого потока, если все пройдет успешно).
Таким образом, исправив синтаксические ошибки и убедившись, что код правильно организован, мы можем получить работающую программу, которая корректно добавляет элементы в список из нескольких потоков.