
- •Вопрос 1. Особенности языка java, принципы ооп, реализация принципов в языке java.
- •Вопрос 2. Понятие класса, объекта, поля, метода; области видимости. Простейшие программы.
- •Вопрос 3. Типы данных, простые, классы, преобразования типов.
- •Вопрос 4. Ключевые слова: static, this, super, final. Примеры использования
- •Вопрос 5. Спецификаторы доступа к классам, полям и методам.
- •Вопрос 6. Системы ввода-вывода в java. Работа с файлами.
- •Вопрос 7. Апплеты, структура и методы жизненного цикла.
- •Вопрос8. Программирование отношений типа является, имеет, использует и создает.
- •Вопрос 9. Интерфейсы. Реализация интерфейсов.
- •Вопрос 10. Исключительные ситуации. Обработка исключений.
- •Вопрос 11. Реализация многопоточности. Создание и запуск потока. Синхронизация потоков.
- •Вопрос 12. Апплеты с многопоточностью.
- •Вопрос 14. Библиотека jdbc. Подключение к базе данных.
- •Вопрос 16. Работа с сетью. Классы InetAddress, Socket, ServeSocket.
- •Вопрос 17. Работа с сетью. Классы DatagramSocket, DatagramPacket.
- •Вопрос 18. Сервлеты. Структура и организация. Методы жизненного цикла.
- •Вопрос 19. Jsp. Структура и организация. Работа с бинами. Класс Session.
- •Вопрос 20. Основы технологии ejb. Основные цели. Ejb компоненты, объект, контейнер. Типы бинов. Home и Remote интерфейсы.
- •Вопрос 21. Жизненный цикл Entity Bean.
Вопрос 11. Реализация многопоточности. Создание и запуск потока. Синхронизация потоков.
Многопоточность.
Существует 2 способа создания нового потока:
Определение класса, производного от класса Thread и создание экземпляров.
При запуске потока будет вызван метод run().
Пример:
import java.lang.*;
public class MyThread extends Thread
{ int wait
public MyThread(int wait) {this.wait = wait;}
public void run()
{ while (true)
{
Sleep(wait);
. . .
}
}
}
. . .
public static void main(…)
{
MyThread m = new MyThread(1000);
m.start( );
}
Пример 2:
import java.lang.*;
public class MyThread extends Thread
{
public static void main(String [] a)
{
MyThread m = new MyThread( );
m.start( );
for (int i=0; i<1000; i++) {
System.out.println(“main = “ +i);}
}
public void run( ) {
for (int j=0; j<1000; j++) {
System.out.println(“Thread = “ +j);}
}
Создание класса, реализующего интерфейс Runnable.
public class My implements Runnable
{
public My( ) {. . .}
public void run( ) {. . .}
{
My m = new My( );
Thread f = new Thread(m);
f.start( );
}
}
В этом случае поток можно создавать в разных классах.
Прерывание потока.
MyThread m = new MyThread( );
m.start( );
m.interrupt( );
public void run( );
{
while (! is Interrubt( ));
{
. . .
}
}
Синхронизация.
Основное отличие состоит в том, что (?).
Использование потоков лишенных подобной защиты позволяет быстро их запускать и способствует повышению их производительности. Однако, возникает отрицательный эффект: любой из потоков может получить доступ и даже внести изменения в данные, которые другой поток считает принадлежащими только ему. Решение этой проблемы состоит в синхронизации потоков.
Пример: имитация работы ядерного реактора.
inThread = new RodThread(true);
outThread = new RodThread(false);
inThread.start;
outThread.start;
public class RodThread extends Thread
{ boolean direct;
int static position – 10;
int count = 0;
static TextArea fText;
public RodThread (boolean direct)
{ this.direct = direct);}
public void run( );
while (position > 0 && position<10 && position<1000)
{ if (direct) position ++; else position --; count ++}
. . .
synchronized(fText){
fText.append(“Final position = “ +position);
fText.append(“Count = “ + count);
}
}
После тысячекратного выполнения работа потоков завершится с выводом в поле fText информации о результатах работы потоков. При продолжении тестировании выяснится, что иногда информация, размещенная в поле fText разными потоками, оказывается перемешанной. Это происходит, когда оба потока выполняют процесс записи в поле одновременно. Решение данной проблемы состоит в получении гарантии, что в любой момент времени только 1 из потоков может получить доступ к полю fText. Для этого в JAVA существует слово synchronized. В этом случае 1 из потоков, войдя в критический участок программы, осуществляет захват поля fText. Если другой поток также попытается войти в этот участок программы, то он будет заблокирован оператором synchronized. Чем меньше размер критического участка, тем больше производительность программы.
Если окажется, что критический участок распространяется на весь метод, то можно указать ключевое слово synchronized в объявлении метода
synchronized void myMethod( ) {. . .}