Delphi | Сети | ПК | Маршрутизаторы | Моделирование | Протоколы | Экспертные системы | Удаленный доступ | Доменные имена
Аплеты | SQL | Надежность | Задачи | Информационные процессы | JAVA | Отказы изделия | Расчет надежности показателей | Инфсис

Объектно-ориентированное программирование в Java

В случае использования двумерного массива также возможно получение той или иной размерности с помощью свойства length. Как и в языке С, имя двумерного массива matrix рассматривается здесь как массив массивов. Поэтому свойство length будет содержать число строк двумерного массива. Количество же элементов в i-ой строке двумерного массива (кстати, количество элементов в разных строках двумерного массива может быть различным) можно будет получить с помощью свойства length массива matrix[i].

Операция new

Пора подробнее описать операцию с одним операндом, обозначаемую словом new . Она применяется для выделения памяти массивам и объектам.

В первом случае в качестве операнда указывается тип элементов массива и количество его элементов в квадратных скобках, например:

double a[] = new double[100];

Во втором случае операндом служит конструктор класса. Если конструктора в классе нет, то вызывается конструктор по умолчанию.

Числовые поля класса получают нулевые значения, логические поля — значение false , ссылки — значение null .

Результатом операции new будет ссылка на созданный объект. Эта ссылка может быть присвоена переменной типа ссылка на данный тип:

Dog k9 = new Dog () ;

но может использоваться и непосредственно

new Dog().voice();

Здесь после создания безымянного объекта сразу выполняется его метод voice() . Такая странная запись встречается в программах, написанных на Java, на каждом шагу. В отличие от метода notify, который "пробуждает" только один поток из очереди, метод notifyAll "пробуждает" все потоки, находящиеся в очереди, предоставляя им возможность состязаться за блокировку объекта.
Типовым примером использования этих методов является организация очереди на обслуживание. Допустим, моделируется работа парикмахерской, в которой работает 4 парикмахера. Создаются два класса - внешний класс отвечает за работу парикмахерской, внутренний класс - класс, производный от класса Thread, моделирует поведение клиента. Внешний класс имеет переменную, например, count, которая в каждый момент времени будет хранить количество клиентов, которые обслуживаются в данный момент. Очевидно, это количество не должно превосходить 4.
При появлении нового клиента вызывается синхронизированный метод внешнего класса, в котором анализируется, существует ли свободное место. Если такового нет, то клиент ставится в очередь с помощью метода wait. По окончании обслуживания какого-либо клиента должен вызываться другой синхронизированный метод, который, в частности, будет уведомлять о том, что появилось свободное место.

class Queue extends Applet
{
int count=0;
// другие данные и методы класса
// ...
// метод, обрабатывающий появление нового клиента
// параметр метода - идентификатор клиента
synchronized void enter(int num)
{
if(count==4)
{
// постановка клиента в очередь
try
{
wait();
}
catch(InterruptedException e){}
}
// выйдет из ожидания только при появлении
// свободного места
count++;
}

// метод, обрабатывающий окончание обслуживания клиента
synchronized void leave()
{
count--;
// оповещает другие потоки о появлении
// свободного места
notify();
}

class Client extends Thread
{
int id; // идентификатор клиента
// разные данные и методы класса
// ...

public void run()
{
enter(id); // появился клиент
// другие действия клиента
// ...
leave(); // конец обслуживания
}
}
}

Задание для самостоятельной работы

Рассмотрите самостоятельно пример 1 из приложения 5, иллюстрирующий совместное использование ресурсов и синхронизацию при работе с потоками.

 

Математический анализ, лекции по физике Компьютерные сети