Forwarded from Java jobs — вакансии для java-разработчиков
#вакансия #Java #JS #Javascript #удаленка #Luxoft
Вакансия: Senior/Tech Lead Full Stack (Java+JS)
Формат работы: Remote
З/п: 380 000 – 480 000 руб
Работа в международной IT-компании Luxoft в проекте по созданию абсолютно нового современного веб портала клиентского кабинета для инвестиционного брокера.
Обязанности:
• разработка масштабируемого архитектурного решения и согласование её с заказчиком
• управление командой разработки
• реализация работающего прототипа и полноценного решения
• контроль качества разработанного решения
Требования:
• Опыт разработки архитектуры web приложений
• Java, Spring 5+ years
• TypeScript, React and/or Angular 3+ years
• Database: MySQL, PostgreSQL
• Понимание, как создавать интеграцию между приложениями
• Понимание, как создавать CI / CD с нуля
• Знание SQL, Kafka, XML, XSD, Json, FIX
• Английский язык не ниже уровня b2 (intermediate)
Условия:
• Официальное трудоустройство
• Расширенный социальный пакет
• Профессиональное обучение
• Корпоративные скидки
• Гибкий график работы
• Возможность удаленной работы
• Участие в конференциях, митапах и подкастах
• Корпоративные мероприятия
Подробности и контакты:
телеграм @anyameschanova, почта [email protected], сайт
Вакансия: Senior/Tech Lead Full Stack (Java+JS)
Формат работы: Remote
З/п: 380 000 – 480 000 руб
Работа в международной IT-компании Luxoft в проекте по созданию абсолютно нового современного веб портала клиентского кабинета для инвестиционного брокера.
Обязанности:
• разработка масштабируемого архитектурного решения и согласование её с заказчиком
• управление командой разработки
• реализация работающего прототипа и полноценного решения
• контроль качества разработанного решения
Требования:
• Опыт разработки архитектуры web приложений
• Java, Spring 5+ years
• TypeScript, React and/or Angular 3+ years
• Database: MySQL, PostgreSQL
• Понимание, как создавать интеграцию между приложениями
• Понимание, как создавать CI / CD с нуля
• Знание SQL, Kafka, XML, XSD, Json, FIX
• Английский язык не ниже уровня b2 (intermediate)
Условия:
• Официальное трудоустройство
• Расширенный социальный пакет
• Профессиональное обучение
• Корпоративные скидки
• Гибкий график работы
• Возможность удаленной работы
• Участие в конференциях, митапах и подкастах
• Корпоративные мероприятия
Подробности и контакты:
телеграм @anyameschanova, почта [email protected], сайт
☕️ OutputStream - это абстрактный класс, определяющий потоковый байтовый вывод;
☕️ BufferedOutputStream - буферизированный выходной поток;
☕️ ByteArrayOutputStream - все данные, посылаемые в этот поток, размещаются в предварительно созданном буфере;
☕️ DataOutputStream - выходной поток байт, включающий методы для записи стандартных типов данных Java;
☕️ FileOutputStream - запись данных в файл на физическом носителе;
☕️ FilterOutputStream - абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства;
☕️ PrintStream - выходной поток, включающий методы print() и println();
☕️ ObjectOutputStream - выходной поток для записи объектов;
☕️ PipedOutputStream реализует понятие выходного канала.
☕️ BufferedOutputStream - буферизированный выходной поток;
☕️ ByteArrayOutputStream - все данные, посылаемые в этот поток, размещаются в предварительно созданном буфере;
☕️ DataOutputStream - выходной поток байт, включающий методы для записи стандартных типов данных Java;
☕️ FileOutputStream - запись данных в файл на физическом носителе;
☕️ FilterOutputStream - абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства;
☕️ PrintStream - выходной поток, включающий методы print() и println();
☕️ ObjectOutputStream - выходной поток для записи объектов;
☕️ PipedOutputStream реализует понятие выходного канала.
Как инициализировать иммутабельный класс? (1/2)
Если прочитать определение immutable-объекта внимательно, момент его создания – это единственный этап в жизненном цикле, когда объект может меняться. Действительно, как иначе установить это неизменяемое состояние. Отсюда, при неправильной реализации, вытекают некоторые риски дальнейшей неизменяемости.
Первое, самое очевидное правило: копируйте поля ссылочных типов. Когда пользователь передал в конструктор изменяемый объект, возможно он все еще владеет ссылкой на него. Тогда, пользуясь этой ссылкой, пользователь может менять поле вашего иммутабельного объекта позднее. Создав копию объекта-параметра перед присвоением в поле, вы получите эксклюзивную ссылку, недоступную извне.
Вторая проблема, с которой вы гораздо менее вероятно столкнетесь, но о которой нужно знать: без должной синхронизации в многопоточной среде конструктор может получить ссылку на не до конца сконструированный объект. Для поддержки создания объектов в многопоточной среде нужно обеспечить создание его полей happens-before. Проблема аналогична double-checked блокировке без ключевого слова
Если прочитать определение immutable-объекта внимательно, момент его создания – это единственный этап в жизненном цикле, когда объект может меняться. Действительно, как иначе установить это неизменяемое состояние. Отсюда, при неправильной реализации, вытекают некоторые риски дальнейшей неизменяемости.
Первое, самое очевидное правило: копируйте поля ссылочных типов. Когда пользователь передал в конструктор изменяемый объект, возможно он все еще владеет ссылкой на него. Тогда, пользуясь этой ссылкой, пользователь может менять поле вашего иммутабельного объекта позднее. Создав копию объекта-параметра перед присвоением в поле, вы получите эксклюзивную ссылку, недоступную извне.
Вторая проблема, с которой вы гораздо менее вероятно столкнетесь, но о которой нужно знать: без должной синхронизации в многопоточной среде конструктор может получить ссылку на не до конца сконструированный объект. Для поддержки создания объектов в многопоточной среде нужно обеспечить создание его полей happens-before. Проблема аналогична double-checked блокировке без ключевого слова
volatile
– детали можно почитать здесь.Stack Overflow
Why is volatile used in double checked locking
From Head First design patterns book, the singleton pattern with double checked locking has been implemented as below:
public class Singleton {
private volatile static Singleton instance;
public class Singleton {
private volatile static Singleton instance;
Как инициализировать иммутабельный класс? (2/2)
Что касается удобства создания immutable объектов. Если класс состоит из всего пары полей – дополнительные действия скорее всего не нужны, хватит обычного конструктора.
Однако, когда полей много, это становится проблемой. В Java, в отличие от таких языков как например TypeScript или Kotlin, нельзя указывать имена передаваемых параметров. Обычно можно воспользоваться сеттерами, но в неизменяемом классе их нет.
Похожая проблема возникает, когда процесс создания объекта не может быть атомарным, потому что он разделен между несколькими сущностями. Разные компоненты предоставляют разные поля, приходится копить их во временных переменных, прежде чем вызвать конструктор.
На помощь приходят порождающие паттерны. Самый распространенный подход – builder (паттерн Строитель). Для иммутабельного типа
Каждый сеттер выполняет роль именованного параметра. Сам билдер, как обычный объект, можно передавать от компонента к компоненту, делегируя им части инициализации. Использование этого паттерна логически разделяет существование объекта типа
Что касается удобства создания immutable объектов. Если класс состоит из всего пары полей – дополнительные действия скорее всего не нужны, хватит обычного конструктора.
Однако, когда полей много, это становится проблемой. В Java, в отличие от таких языков как например TypeScript или Kotlin, нельзя указывать имена передаваемых параметров. Обычно можно воспользоваться сеттерами, но в неизменяемом классе их нет.
Похожая проблема возникает, когда процесс создания объекта не может быть атомарным, потому что он разделен между несколькими сущностями. Разные компоненты предоставляют разные поля, приходится копить их во временных переменных, прежде чем вызвать конструктор.
На помощь приходят порождающие паттерны. Самый распространенный подход – builder (паттерн Строитель). Для иммутабельного типа
Foo
создается дополнительный изменяемый класс FooBuilder
. В билдере есть сеттеры для каждого поля. Эти сеттеры обычно возвращают this
, что позволяет вызывать их в цепочке. Цепочка заканчивается методом build()
, который уже создает иммутабельный Foo
.Каждый сеттер выполняет роль именованного параметра. Сам билдер, как обычный объект, можно передавать от компонента к компоненту, делегируя им части инициализации. Использование этого паттерна логически разделяет существование объекта типа
Foo
на два этапа – создание и использование.Wikipedia
Named parameter
concept in computer programming
Forwarded from Java jobs — вакансии для java-разработчиков
#вакансия #Java #удаленка #Luxoft
Вакансия: Senior Java Developer
Формат работы: Remote
З/п: 350 000 – 450 000 руб.
Наш клиент − американский многонациональный инвестиционный банк и корпорация финансовых услуг. В настоящее время мы создаем новую команду, которая будет отвечать за валютные риски и ценовые платформы. Команда будет внедрять новые бизнес-функции, технические и нормативные изменения, автоматизацию контроля качества и DevOps, а также производственную поддержку ряда приложений.
Задачи:
• Внедрение сложных бизнес-ориентированных изменений, проведение анализа воздействия и тестирования
• Прямая связь с заинтересованными сторонами бизнеса
• Дизайн (high-availability, fault-tolerant, low latency)
• Разработка архитектуры и бизнес-потоков для новой платформы
• Разработка, дизайн и архитектура для новых проектов в системах real-time low-latency.
• Анализ сложных производственных проблем, особенно в бизнес-логике
• Сотрудничество с глобально распределенной командой разработчиков, бизнес-аналитиков, специалистов по обеспечению качества и поддержке
Требования:
• Опыт работы разработчиком Java более 5 лет
• Хороший опыт анализа существующих приложений Java/C#, понимание потоков, умение работать с ограниченной документацией по приложениям
• Опыт работы с TDD и автоматизированными инструментами тестирования
• Опыт работы в системах управления исходным кодом, таких как GIT
• Хороший письменный и разговорный английский
Условия:
• Официальное трудоустройство
• Расширенный социальный пакет
• Профессиональное обучение
• Корпоративные скидки
• Гибкий график работы
• Возможность удаленной работы
• Участие в конференциях, митапах и подкастах
• Корпоративные мероприятия
Подробности и контакты:
telegram @dvarshukova, почта [email protected], сайт
Вакансия: Senior Java Developer
Формат работы: Remote
З/п: 350 000 – 450 000 руб.
Наш клиент − американский многонациональный инвестиционный банк и корпорация финансовых услуг. В настоящее время мы создаем новую команду, которая будет отвечать за валютные риски и ценовые платформы. Команда будет внедрять новые бизнес-функции, технические и нормативные изменения, автоматизацию контроля качества и DevOps, а также производственную поддержку ряда приложений.
Задачи:
• Внедрение сложных бизнес-ориентированных изменений, проведение анализа воздействия и тестирования
• Прямая связь с заинтересованными сторонами бизнеса
• Дизайн (high-availability, fault-tolerant, low latency)
• Разработка архитектуры и бизнес-потоков для новой платформы
• Разработка, дизайн и архитектура для новых проектов в системах real-time low-latency.
• Анализ сложных производственных проблем, особенно в бизнес-логике
• Сотрудничество с глобально распределенной командой разработчиков, бизнес-аналитиков, специалистов по обеспечению качества и поддержке
Требования:
• Опыт работы разработчиком Java более 5 лет
• Хороший опыт анализа существующих приложений Java/C#, понимание потоков, умение работать с ограниченной документацией по приложениям
• Опыт работы с TDD и автоматизированными инструментами тестирования
• Опыт работы в системах управления исходным кодом, таких как GIT
• Хороший письменный и разговорный английский
Условия:
• Официальное трудоустройство
• Расширенный социальный пакет
• Профессиональное обучение
• Корпоративные скидки
• Гибкий график работы
• Возможность удаленной работы
• Участие в конференциях, митапах и подкастах
• Корпоративные мероприятия
Подробности и контакты:
telegram @dvarshukova, почта [email protected], сайт
Ozon объявляет о старте набора на бесплатный курс "Быстрый переход на Go"!
Выпускники получат возможность работать в одной из самых больших Golang-команд России.
Программа рассчитана на middle/senior разработчиков Java, C++, PHP? Python и др. языков с опытом промышленной разработки от 2 лет.
Всего за 1 месяц под руководством опытных наставников ты освоишь современный язык программирования, входящий в тройку самых оплачиваемых в 2020 г. (можете проверить)
Обучение проходит онлайн. После успешного окончания курса получишь не только знания и навыки, но и оффер от Ozon!
Прими участие в отборе - пришли заявку с резюме до конца июня!
Обучение бесплатно: https://ozon.ru/t/DYovq
Выпускники получат возможность работать в одной из самых больших Golang-команд России.
Программа рассчитана на middle/senior разработчиков Java, C++, PHP? Python и др. языков с опытом промышленной разработки от 2 лет.
Всего за 1 месяц под руководством опытных наставников ты освоишь современный язык программирования, входящий в тройку самых оплачиваемых в 2020 г. (можете проверить)
Обучение проходит онлайн. После успешного окончания курса получишь не только знания и навыки, но и оффер от Ozon!
Прими участие в отборе - пришли заявку с резюме до конца июня!
Обучение бесплатно: https://ozon.ru/t/DYovq
🗣 Путь в Java, или Зачем нужен ментор: интервью
Поговорили с Java-разработчиком Анатолием Марандюком. О выборе Java, курсах, собеседованиях и хобби-проектах. Анатолий готов ответить на ваши вопросы в комментариях к посту.
https://proglib.io/sh/Ld9SPmXRVv
Поговорили с Java-разработчиком Анатолием Марандюком. О выборе Java, курсах, собеседованиях и хобби-проектах. Анатолий готов ответить на ваши вопросы в комментариях к посту.
https://proglib.io/sh/Ld9SPmXRVv
Forwarded from Java jobs — вакансии для java-разработчиков
#вакансия #Java #Luxoft
Вакансия: Senior Java Developer
Формат работы: Москва
З/п: 200 000 – 350 000 руб.
Мы создаем современную систему онлайн-регистрации Корпоративных клиентов банка. Наше решение представляет собой защищенную высокопроизводительную цифровую платформу, которая автоматизирует процессы и сводит к минимуму ручные операции.
Задачи:
• Разработка новых компонентов и функций, расширение существующих функциональных возможностей (Java 8, Kotlin, Spring, SQL)
• Интеграция API с третьими сторонами
• Архитектурный дизайн
• Оценка и внедрение новых инструментов разработки
• Тестирование
• Экспертный дизайн и обзоры кода
Требования:
• Опыт работы разработчиком Java более 6 лет
• Опыт работы в веб-проектах
• Хорошее знание Java 8, Spring, SQL.
• Веб-сервисы (HTTP, SOAP, REST и т.д.)
• Знание современных инструментов и методов разработки программного обеспечения
• Разговорный английский язык
Условия:
• Официальное трудоустройство
• Расширенный социальный пакет
• Профессиональное обучение
• Корпоративные скидки
• Гибкий график работы
• Возможность удаленной работы
• Участие в конференциях, митапах и подкастах
• Корпоративные мероприятия
Подробности и контакты:
telegram @Tamara_IT, почта [email protected] и сайт
Вакансия: Senior Java Developer
Формат работы: Москва
З/п: 200 000 – 350 000 руб.
Мы создаем современную систему онлайн-регистрации Корпоративных клиентов банка. Наше решение представляет собой защищенную высокопроизводительную цифровую платформу, которая автоматизирует процессы и сводит к минимуму ручные операции.
Задачи:
• Разработка новых компонентов и функций, расширение существующих функциональных возможностей (Java 8, Kotlin, Spring, SQL)
• Интеграция API с третьими сторонами
• Архитектурный дизайн
• Оценка и внедрение новых инструментов разработки
• Тестирование
• Экспертный дизайн и обзоры кода
Требования:
• Опыт работы разработчиком Java более 6 лет
• Опыт работы в веб-проектах
• Хорошее знание Java 8, Spring, SQL.
• Веб-сервисы (HTTP, SOAP, REST и т.д.)
• Знание современных инструментов и методов разработки программного обеспечения
• Разговорный английский язык
Условия:
• Официальное трудоустройство
• Расширенный социальный пакет
• Профессиональное обучение
• Корпоративные скидки
• Гибкий график работы
• Возможность удаленной работы
• Участие в конференциях, митапах и подкастах
• Корпоративные мероприятия
Подробности и контакты:
telegram @Tamara_IT, почта [email protected] и сайт
Ответ
1. Использовать метод keySet(), который возвращает множество Set<K> ключей.
2. Использовать метод values(), который возвращает коллекцию Collection<V> значений.
1. Использовать метод keySet(), который возвращает множество Set<K> ключей.
2. Использовать метод values(), который возвращает коллекцию Collection<V> значений.
Telegram
Библиотека джависта
#вопросы_с_собеседований
1. Как перебрать все ключи Map?
2. Как перебрать все значения Map?
1. Как перебрать все ключи Map?
2. Как перебрать все значения Map?
Что такое Keyword?
Зарезервированные слова в Java – это специальные последовательности символов, которые воспринимаются компилятором особым образом. Такие слова нельзя использовать как названия классов, переменных, и для других идентификаторов. Все зарезервированне слова можно разбить на три больших группы. Все они перечислены в таблице ниже.
1. 4 зарезервированных слова не являются ключевыми словами: это литералы
2. 51 ключевое слово (keywords). В таблице мы сгруппировали их по смыслу.
3. 10 ограниченных ключевых слов (restricted keywords). Они считаются ключевыми словами только в контексте файла объявления модуля
#Язык
Зарезервированные слова в Java – это специальные последовательности символов, которые воспринимаются компилятором особым образом. Такие слова нельзя использовать как названия классов, переменных, и для других идентификаторов. Все зарезервированне слова можно разбить на три больших группы. Все они перечислены в таблице ниже.
1. 4 зарезервированных слова не являются ключевыми словами: это литералы
true
, false
, null
, и специальный идентификатор выводимого типа var
.2. 51 ключевое слово (keywords). В таблице мы сгруппировали их по смыслу.
3. 10 ограниченных ключевых слов (restricted keywords). Они считаются ключевыми словами только в контексте файла объявления модуля
module-info
. В обычных .java
-файлах это разрешенные идентификаторы.#Язык
Кругом только и слышно, что об искусственном интеллекте, машинном обучении, Data Science... Но как начинаешь разбираться, нужна серьёзная математическая подготовка на уровне вуза. Мы пригласили опытных преподавателей МГУ помочь нашим читателям подготовиться к карьере дата сайентиста.
В наборе всё, что нужно: мат. анализ, линейная алгебра, комбинаторика, теория вероятностей и мат. статистика. Кстати, именно такой багаж знаний требуют от абитуриентов ШАД. Каждая тема сопровождается подготовительными материалами, лекциями и практическими заданиями. Всё это с обратной связью кураторов и преподавателей.
Полная программа курса и прочая информация здесь
Специально для наших подписчиков скидка 15% по промокоду JAVAPROGLIB
Поспешите, осталось всего 9 мест.
В наборе всё, что нужно: мат. анализ, линейная алгебра, комбинаторика, теория вероятностей и мат. статистика. Кстати, именно такой багаж знаний требуют от абитуриентов ШАД. Каждая тема сопровождается подготовительными материалами, лекциями и практическими заданиями. Всё это с обратной связью кураторов и преподавателей.
Полная программа курса и прочая информация здесь
Специально для наших подписчиков скидка 15% по промокоду JAVAPROGLIB
Поспешите, осталось всего 9 мест.
#вопросы_с_собеседований
В equals() требуется проверять, что аргумент equals(Object that) такого же типа что и сам объект. В чем разница между this.getClass() == that.getClass() и that instanceof MyClass?
В equals() требуется проверять, что аргумент equals(Object that) такого же типа что и сам объект. В чем разница между this.getClass() == that.getClass() и that instanceof MyClass?
Оператор instanceof сравнивает объект и указанный тип. Его можно использовать для проверки, является ли данный объект экземпляром некоторого класса, либо экземпляром его дочернего класса, либо экземпляром класса, который реализует указанный интерфейс.
this.getClass() == that.getClass() проверяет два класса на идентичность, поэтому для корректной реализации контракта метода equals() необходимо использовать точное сравнение с помощью метода getClass().
this.getClass() == that.getClass() проверяет два класса на идентичность, поэтому для корректной реализации контракта метода equals() необходимо использовать точное сравнение с помощью метода getClass().
Окунись в мир белого хакинга уже сегодня! Пройди бесплатный онлайн-интенсив Skillbox по программированию, изучи востребованный язык программирования Java и создай свой первый проект под руководством опытного специалиста.
Все подробности по ссылке: 👉 https://clc.am/y6eyxw.
За 3 дня интенсива ты:
⚡️ Освоишь основные инструменты программирования на Java.
⚡️ Напишешь программу для мониторинга активности рабочего стола.
⚡️ Получишь полезные советы разработчика с 15-летним опытом — Даниила Пилипенко.
⚡️ Узнаешь, как устроена работа Java-программиста.
🎁 Каждый участник интенсива, который выполнит домашнюю работу, получит сертификат на 15 000 рублей на оплату любого курса в Skillbox и электронную книгу «Век живи — век учись» Кей Петерсон и Дэвида Колба издательства МИФ.
Подключайся к прямому эфиру с 7 по 9 июня в 16:00 по московскому времени 😉
Все подробности по ссылке: 👉 https://clc.am/y6eyxw.
За 3 дня интенсива ты:
⚡️ Освоишь основные инструменты программирования на Java.
⚡️ Напишешь программу для мониторинга активности рабочего стола.
⚡️ Получишь полезные советы разработчика с 15-летним опытом — Даниила Пилипенко.
⚡️ Узнаешь, как устроена работа Java-программиста.
🎁 Каждый участник интенсива, который выполнит домашнюю работу, получит сертификат на 15 000 рублей на оплату любого курса в Skillbox и электронную книгу «Век живи — век учись» Кей Петерсон и Дэвида Колба издательства МИФ.
Подключайся к прямому эфиру с 7 по 9 июня в 16:00 по московскому времени 😉
#вопросы_с_собеседований
В чем разница между Collection и Stream?
В чем разница между Collection и Stream?
Коллекции позволяют работать с элементами по отдельности, тогда как стримы так делать не позволяют, но вместо этого предоставляют возможность выполнять функции над данными как над одним целым.
Также стоит отметить важность самой концепции сущностей: Collection - это прежде всего воплощение Структуры Данных. Например, Set не просто хранит в себе элементы, он реализует идею множества с уникальными элементами, тогда как Stream, это прежде всего абстракция необходимая для реализации конвеера вычислений, собственно поэтому, результатом работы конвеера являются те или иные Структуры Данных или же результаты проверок/поиска и т.п.
Также стоит отметить важность самой концепции сущностей: Collection - это прежде всего воплощение Структуры Данных. Например, Set не просто хранит в себе элементы, он реализует идею множества с уникальными элементами, тогда как Stream, это прежде всего абстракция необходимая для реализации конвеера вычислений, собственно поэтому, результатом работы конвеера являются те или иные Структуры Данных или же результаты проверок/поиска и т.п.
#вопросы_с_собеседований
Что такое «контейнер сервлетов»?
Что такое «контейнер сервлетов»?
Контейнер сервлетов — программа, представляющая собой сервер, который занимается системной поддержкой сервлетов и обеспечивает их жизненный цикл в соответствии с правилами, определёнными в спецификациях. Может работать как полноценный самостоятельный веб-сервер, быть поставщиком страниц для другого веб-сервера, или интегрироваться в Java EE сервер приложений.
Контейнер сервлетов обеспечивает обмен данными между сервлетом и клиентами, берёт на себя выполнение таких функций, как создание программной среды для функционирующего сервлета, идентификацию и авторизацию клиентов, организацию сессии для каждого из них.
Наиболее известные реализации контейнеров сервлетов:
☕️ Apache Tomcat
☕️ Jetty
☕️ JBoss
☕️ WildFly
☕️ GlassFish
☕️ IBM WebSphere
☕️ Oracle Weblogic
Контейнер сервлетов обеспечивает обмен данными между сервлетом и клиентами, берёт на себя выполнение таких функций, как создание программной среды для функционирующего сервлета, идентификацию и авторизацию клиентов, организацию сессии для каждого из них.
Наиболее известные реализации контейнеров сервлетов:
☕️ Apache Tomcat
☕️ Jetty
☕️ JBoss
☕️ WildFly
☕️ GlassFish
☕️ IBM WebSphere
☕️ Oracle Weblogic
#вопросы_с_собеседований
В чём заключается разница между методами start() и run()?
В чём заключается разница между методами start() и run()?
Несмотря на то, что start() вызывает метод run() внутри себя, это не то же самое, что просто вызов run(). Если run() вызывается как обычный метод, то он вызывается в том же потоке и никакой новый поток не запускается, как это происходит в случае, когда вы вызываете метод start().