Комментарии (24)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Саня-Питерски на подхвате
29 сентября 2022, 09:41
У объектов типа Thread есть логическое поле/флаг со значением false по умолчанию. ОбъектПотока.interrupt() - просто меняет этот флаг на true, чтобы условие цикла while (!current.isInterrupted()) {} стало ложным и он оборвался. .isInterrupted() как раз возвращает значение флага. Проблема в том, что при использовании статического метода класса Thread - Thread.sleep(10000) и ОбъектПотока.join() программа "засыпает", и следовательно, никаких проверок условия while не происходит. Короче говоря, если поток заснет на 100 лет, а мы его прервем, то узнает он об этом лишь по прошествии этих 100 лет, так как условия выхода из цикла никто не проверял все это время. Именно поэтому метод join и sleep постоянно проверяют, не был ли изменен флаг текущего потока, и если был, то нафиг ждать 100 лет, выбрасываем InterruptedException и поехали дальше. Поэтому: " Более того, в методе sleep, который так любят использовать для организации вечного цикла в методе run, есть автоматическая проверка переменной isInterrupt. Если нить вызовет метод sleep, то этот метод сначала проверит, а не установлена ли для текущей (вызвавшей его нити) переменная isInterrupt в true. И если установлена, то метод не будет спать, а выкинет исключение InterruptedException. "
Саня-Питерски на подхвате
29 сентября 2022, 09:41
interrupt() - ставит флаг треда на true (тред прерван) isInterrupted() - не статический метод для проверки флага (не трогает значение флага) Thread.interrupted() - статический метод Thread, который проверяет значение флага и сбрасывает его (переводит в false) Важно знать, что wait, join и sleep (все то, что бросает исключение InterruptedException) осуществляет проверку через Thread.interrupted(), а не isInterrupted(). Это важно, потому что иначе получится неожиданная ситуация, например, такая:
public void run() {
    while (!Thread.currentThread().isInterrupted()) {
        System.out.println(("Тред работает"));
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
Если тред прервется во время "сна", то будет выброшено InterruptedException, а флаг вернется в состояние false. Из-за этого тред продолжит свою работу, даже не зная, что был прерван. В конкретном примере это можно исправить либо так:
public void run() {
    try {
        while (!Thread.currentThread().isInterrupted()) {
            System.out.println(("Тред работает"));
            Thread.sleep(1000);
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
Либо так:
public void run() {
    while (!Thread.currentThread().isInterrupted()) {
        System.out.println(("Тред работает"));
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
            Thread.currentThread().interrupt();
        }
    }
}
Саня-Питерски на подхвате
21 сентября 2022, 18:35
split
Саня-Питерски на подхвате
20 сентября 2022, 16:46
А почему все же contains, а не equals? )) И кстати, у String есть метод startsWith()
Саня-Питерски на подхвате
20 сентября 2022, 16:41
Самое простое - ввести номер группы, которую хочешь найти. Просто group() или group(0) вернёт всё вхождение, попадающее под маску. group(i), где i > 0 вернёт содержимое i-той пары скобок, в данном случае тебе нужно group(1). Существуют и другие способы, например ты можешь написать регулярку, полное вхождение которой не будет вообще захватывать предшествующий символ, но это со звёздочкой можешь поискать самостоятельно, там чуть более сложно. PS Вместо "\\?([a-z]*)|\\&([a-z]*)" проще написать "[?&]([a-z]*)", смысл идентичен, но лаконичнее и понятнее.
Саня-Питерски на подхвате
19 сентября 2022, 20:18
Дебагер https://javarush.com/help/84544
Саня-Питерски на подхвате
19 сентября 2022, 20:04
Используй дебаг. Для этого поставь breakpoint-ы (Ctrl+F8), потом зайди в меню Run -> Debug. F9 - выполнение кода до следующего breakpoint-а. F8 - переход к следующей строке кода.
Саня-Питерски на подхвате
19 сентября 2022, 20:01
Simple Solution


public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }
}
Самая простая реализация.

Плюсы:
Простота и прозрачность кода

Потокобезопасность

Высокая производительность в многопоточной среде

Минусы:
Не ленивая инициализация.
В попытке исправить последний недостаток, мы получаем реализацию номер два:
----------------------------------
Lazy Initialization


public class Singleton {
  private static Singleton INSTANCE;

  private Singleton() {}

  public static Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
Плюсы:
Ленивая инициализация.

Минусы:
Не потокобезопасно

Реализация интересна. Мы можем инициализироваться лениво, но утратили потокобезопасность. Не беда: в реализации номер три мы все синхронизируем.

--------------------------
.............
Саня-Питерски на подхвате
19 сентября 2022, 20:02
https://javarush.com/groups/posts/2365-patternih-proektirovanija-singleton?ysclid=l88zshuaah490001126
Саня-Питерски на подхвате
19 сентября 2022, 19:39
String outputFileName = "file.txt";
		String[] array = { "one", "two", "three", "four" };

		try (BufferedWriter writter = new BufferedWriter(new FileWriter(outputFileName))) {
			for (String value : array) {
				writter.write(value + "\n");
			}
-----------------------------------------------------

String inputFileName = "file.txt";

		try (BufferedReader reader = new BufferedReader(new FileReader(inputFileName))) {
			String line;
			while ((line = reader.readLine()) != null) {
				System.out.println(line + "\n");
			}
		}
                catch (IOException e) {
			e.printStackTrace();
		}
	}
Саня-Питерски на подхвате
19 сентября 2022, 18:41
1. Сначала инициализируются статические блоки и статические переменные класса-родителя. 2. Затем статические блоки и статические переменные наследника. 3. Далее нестатические блоки и переменные родителя. 4. После этого, конструктор родителя. 5. Далее нестатические блоки и переменные наследника. 6. И наконец конструктор наследника.