- •Краткая историческая справка.
- •Преимущества языка Java.
- •Недостатки java:
- •Лекция 2. Этапы разработки java-приложений. Этапы разработки java-приложений.
- •Установка jdk.
- •Инсталляция исходных кодов библиотек
- •Инсталляция пакета документации.
- •Тестирование правильности установки и создание простейшей программы
- •Визуальные среды программирования.
- •Лекция 3. Переменные и типы данных. Переменные и типы данных.
- •Подробности о примитивных типах.
- •Лекция 4. Операторы и функции. Операторы и функции.
- •Операторы ветвлений и циклов.
- •Оператор цикла while.
- •Оператор цикла for.
- •Лекция 5. Объектно ориентированное программирование Объектно ориентированное программирование.
- •Определение объекта.
- •Инкапсуляция.
- •Наследование.
- •Полиморфизм (перегрузка).
- •Пример ооп – программы.
- •Отличие перегрузки функций от переопределения.
- •Отличие классов от интерфейсов.
- •Лекция 6. Массивы и строки. Массивы и строки.
- •Многомерные массивы.
- •Приведение типов и динамические массивы.
- •Строки в java.
- •Лекция 7. Организация ввода-вывода данных Организация ввода-вывода данных.
- •Функции стандартной библиотеки ввода/вывода.
- •Новая библиотека ввода/вывода.
- •Классы потокового ввода/вывода из пакета java.Io.
- •Лекция 8. Обработка исключений. Обработка исключений.
- •Классификация исключений.
- •Перехват исключений блоками try/catch.
- •Самостоятельное выбрасывание исключений.
- •Разработка собственных классов исключений.
- •Лекция 9. Потоки. Потоки.
- •1. Cпециальный класс Thread.
- •2. Реализация интерфейса Runnable.
- •Выбор между использованием класса Thread и интерфейса Runnable.
- •Синхронизация потоков с помощью оператора synchronized.
- •Синхронизация потоков с помощью семафоров.
- •Лекция 10. Подключаемые библиотеки java. Подключаемые библиотеки java.
- •Библиотека awt
- •Внутреннее устройство системы обработки событий awt.
- •Библиотека Swing.
2. Реализация интерфейса Runnable.
Класс находится в пакете java.lang.Runnable.
В общем случае реализация многопоточного приложения с помощью интерфейса Runnable основывается на том же классе Thread, однако доступ к нему мы получаем через класс – обертку, реализующий интерфейс Runnable. Общий каркас приложения:
static class RunnableSample implements Runnable {
public void run() {
System.out.println("делаем что-то полезное");
}
}
public static void main(String[] args) {
RunnableSample rs1 = new RunnableSample();
Thread t1 = new Thread(rs1);
t1.start();
}
Пример, который мы разбирали выше можно переделать под использование интерфейса Runnable следующим образом:
static class MyThread implements Runnable {
private String str;
MyThread(String s) {
str = s;
}
public void run() {
for(int i = 0; i < 10; i++) {
try {
Thread.sleep(5);
} catch (InterruptedException e) {}
System.out.print(str + " ");
}
System.out.print(" ");
System.out.print(" \n");
}
}
public static void main(String[] args) {
new Thread(new MyThread("1"), "T1").start();
new Thread(new MyThread("2"), "T1").start();
}
Класс нашего потока почти не изменился за исключением того, что он теперь не расширяет класс Threads, а реализует интерфейс Runnable. Основные изменения коснулись способа создания класса. Теперь мы вначале создаем класс MyThread("1"), затем передаем экземпляр этого класса классу Thread вместе с именем потока, напоследок из класса Thread вызывается функция start().
Такая запись вполне правомерна, если учесть, что в классе Thread есть 8 конструкторов, каждый из которых принимает на вход разные аргументы:
Thread();
Thread(Runnable rn);
Thread(Runnable rn, String name);
Thread(String name);
Thread(ThreadGroup group, Runnable rn, String name);
Thread(ThreadGroup group, Runnable rn)
Thread(ThreadGroup group, String name);
Thread(ThreadGroup group, Runnable rn, String name, long stackSize);
Как видите можно использовать любой по вашему выбору, в том числе и те, которые принимают на вход экземпляры класса, реализующего интерфейс Runnable.
Выбор между использованием класса Thread и интерфейса Runnable.
Преимуществом наследования класса Thread является полный доступ ко всем функциональным возможностям потока через набор методов класса. Главным недостатоком является само наследование. В java принята одиночная модель наследования, в том смысле, что можно наследовать только от одного класса. Это обстоятельство может стать проблемой при разработке программ промышленного уровня, в которых из – за обилия дополнительного функционала бизнес – логики, обычно требуется модель множественого наследования. Реализация интерфейса частично решает эту проблему, поскольку класс может реализовывать несколько интерфейсов одновременно. Таким образом, в этом смысле использование интерфейса Runnable будет предпочтительнее, хотя в силу наличия дополнительной прослойки в виде интерфейса Runnable, исчезает возможность прямого управления потоком из класса MyThread. Хотя это все относительные трудности благодаря наличию статических методов класса Thread. Например, метода currentThread(), возвращающего ссылку на текущий поток.
Поэтому однозначеного ответа о предпочтении того или другого способа не существует.
Обычно в реальных программах в зависимости от текущих задач и личных предпочтений программиста может использоваться и тот и другой. Обычно наследование класса Thread применяют тогда, когда необходимо создать пользовательский поток, расширяющий функциональность класса java.lang.Thread. Такое решение применяют при разработке системного ПО и различных серверов приложений. Интерфейс Runnable применяют в том случае, когда необходимо просто выполнить несколько задач, без необходимости внесения значительных изменений в сам механизм обработки многопоточности.
