Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпори JAVA.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
178.34 Кб
Скачать

84. Робота із файловою системою.

Взаємодія з файлової системою здійснюється через клас File з пакету java.io. Директорія розглядається як особливий файл.

Методи описують властивості файлу:

exists ( ) - визначає , чи існує реально файл;

  1. isDirectory ( ) - чи є файл директорією ;

  2. isFile ( ) - чи є файл звичайним файлом ( для деяких системних файлів результат буде false ) ;

  3. length ( ) - розмір файлу;

  4. isHidden ( ) - прихований чи файл;

  5. lastModified ( ) - час останньої модифікації в мілісекундах минули з 1 січня 1970 ;

  6. list ( ) , listFile ( ) - отримання вмісту директорії ( у вигляді імен або об'єктів типу File) .

  7. Методи list ( ) і listFile ( ) можуть використовувати фільтр файлів - об'єкт реалізує інтерфейс FileFilter (або FilenameFilter ) . Більш менш звичний фільтр файлів можна реалізувати за допомогою регулярних виразів.

Методи роботи з файловою системою:

listRoots () - статичний метод, який повертає масив кореневих пристроїв (розділів);

createNewFile () - створення нового файлу, якщо він не існує;

delete () - видалення файлу;

mkdir (), mkdirs () - створення директорії;

renameTo () - перейменування файлу;

getFreeSpace () - розмір вільного місця на розділі в байтах;

getTotalSpace () - загальний розмір розділу;

getUsableSpace () - розмір доступного місця на розділі для поточної віртуалной машині

59. Робота із пріоритетами потоків

Розглянемо , як в Java потокам можна призначати пріоритети. Для цього в класі Thread

існують методи getPriority ( ) і setPriority ( ) , а також оголошені три константи:

Інтерфейс Runnable Стор. 5 з 24

MIN_PRIORITY

MAX_PRIORITY

NORM_PRIORITY

З назви очевидно, що їх значення описують мінімальне , максимально і нормальне ( за замовчуванням ) значення пріоритету.

Розглянемо наступний приклад:

public class ThreadTest implements Runnable {

 public void run () {

  double calc ;

  for ( int i = 0 ; i < 50000 ; i + +) {

   calc = Math.sin ( i * i ) ;

   if ( i % 10 000 == 0 ) {

    System.out.println ( getName ( ) + " counts " + i/10000 ) ;}}}

public String getName () {

  return Thread.currentThread ( ) . getName ();}

public static void main ( String s []) {

 / / Підготовка потоків

  Thread t [] = new Thread [ 3 ] ;

  for ( int i = 0 ; i < t.length ; i + +) {

   t [ i ] = new Thread ( new ThreadTest ( ) , " Thread" + i ) ;

  }

/ / Запуск потоків

  for ( int i = 0 ; i < t.length ; i + +) {

   t [ i ] . start ();

   System.out.println ( t [ i ] . GetName ( ) + " started " ) ;

 }}}

У прикладі використовується кілька нових методів класу Thread:

• getName ( )

Зверніть увагу , що конструктору класу Thread передається два параметри . До

реалізації Runnable додається рядок . Це ім'я потоку , яке використовується тільки

для спрощення його ідентифікації . Імена декількох потоків можуть збігатися. Якщо

його не поставити , то Java генерує просту рядок виду " Thread -" і номер потоку

(обчислюється простим лічильником ) Саме це ім'я повертається методом getName ( ) .

Його можна змінити за допомогою методу setName ( ) .

Програмування на Java

Стор. 6 з 24 Базові класи для роботи з потоками

Rendered by www.RenderX.com • currentThread ( )

Цей статичний метод дозволяє в будь-якому місці коду отримати посилання на об'єкт

класу Thread , який представляє поточний потік виконання.

Можна бачити , що всі три потоки були запущені один за іншим , і почали проводити

обчислення. Видно також , що потоки виконуються без певного порядку , випадковим чином. Тим не менш, в середньому вони рухаються з однією швидкістю , ніхто не відстає і не догоняет.Введем в програму роботу з пріоритетам , розставимо різні значення для різних потоків і подивимося , як це позначиться на виконанні . Змінюється тільки метод main ( )

public static void main ( String s []) {

/ / Підготовка потоків

 Thread t [] = new Thread [ 3 ] ;

 for ( int i = 0 ; i < t.length ; i + +) {

  t [ i ] = new Thread ( new ThreadTest ( ) , " Thread" + i ) ;

  t [ i ] . setPriority ( Thread.MIN_PRIORITY +

( Thread.MAX_PRIORITY - Thread.MIN_PRIORITY ) / t.length * i ) ;

 }

/ / Запуск потоків

 for ( int i = 0 ; i < t.length ; i + +) {

  t [ i ] . start ();

  System.out.println ( t [ i ] . GetName ( ) + " started " ) ;

 }

}

Формула обчислення пріоритетів дозволяє рівномірно розподілити всі допустимі значення для всіх запускаються потоки . Насправді , константа мінімального пріоритету має значення 1 , максимального - 10 , нормального - 5 . Так що в простих програмах можна явно користуватися цими величинами і вказувати в якості, наприклад , зниженого пріоритету значення 3 .

Результатом роботи буде :

Thread 0 startedThread 1 startedThread 2 startedThread 2 counts 0 ...

Потоки , як і раніше , стартують послідовно . Але потім відразу видно , що чим вище

пріоритет , тим швидше відпрацьовує потік . Проте дуже показово , що потік

з мінімальним пріоритетом ( Thread 0 ) проте отримав можливість виконати

одну дію раніше, ніж відпрацював потік з вищим пріоритетом ( Thread 1 ) . це

говорить про те , що пріоритети не роблять систему однопоточному , що виконує

одноразово лише один потік з найвищим пріоритетом . Навпаки , пріоритети

дозволяють одночасно працювати над кількома завданнями з урахуванням їх важливості.

Якщо збільшити параметри методу ( виконувати 500.000 обчислень , а не 50.000 , і виводити

повідомлення кожне 1000 обчислення , а не 10.000 ) , то можна буде наочно побачити , що

всі три потоки мають можливість виконувати свої дії одночасно , просто більш

високий пріоритет дозволяє виконувати їх частіше.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]