НМЦ

ОБ’ЄКТНО ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ

Електронний посібник

 

ВФПО

Модуль 8

 

8. Багатопотоковість. Мережеві можливості. Платформа netbeans

8.1. Багатопотоковість у JAVA

8.2. Робота з мережею

8.3. Розробка додатків для платформи NetBeans

8.4. Розповсюдження додатків для платформи netbeans. Інсталятори. Bootstrap. портативні додатки

 

8. Багатопотоковість. Мережеві можливості. Платформа netbeans

8.1. Багатопотоковість у JAVA

 

Відеозапис лекції:

 

 

Частина 1: Багатопоточність в Java

https://drive.google.com/file/d/1PbY82_Z8Mq3HHVRUSZot8Ko_PzsBfmJo/view

 

Паралелізм у програмуванні (Concurrency) – це створення програм у вигляді кількох виконуваних, паралельно взаємодіючих між собою гілок (частин) програми

 

Розрізняють процеси (processes) та потоки або нитки (threads). Частина перекладачів перекладають thread, як "потоки виконання", проте в низці випадків цей переклад призводить до плутанини через існування потоків вводу/виводу (I/O Streams). Нитки є паралельно виконуваними частинами процесу. Процеси – незалежні від інших процесів, на відміну від ниток. Зокрема кожен процес має власний адресний простір у пам'яті комп'ютера, нитки ж одного процесу використовують спільний адресний простір пам'яті.

У програмуванні на Java програмістам, зазвичай, доводиться мати справу з окремими нитками. Багатонитковість (multithreading) є важливою можливістю Java. Кожна програма Java має хоча б одну нитку виконання. Виконання програми розпочинається зі створення головної нитки (main thread).

Під час роботи з нитками програміст може або вручну керувати ними, або ж використовувати спеціальний менеджер – виконувач (executor). Спочатку необхідно розглянути перший спосіб керування нитками виконання.

 

Кожна нитка – це екземпляр класу Thread. Щоб мати змогу створити нову нитку та оперувати нею, зрозуміло, що необхідний код для виконання у цій нитці.

 

Це можна зробити двома шляхами:

через реалізацію інтерфейсу Runnable, що робиться через визначення методу run:

public class HelloRunnable implements Runnable {

    public void run() {

        System.out.println("Привіт - це нитка!");

    }

    public static void main(String args[]) {

        (new Thread(new HelloRunnable())).start();

    }

}

другий спосіб полягає у створенні підкласу для Thread. Клас Thread уже містить реалізацію інтерфейсу Runnable. Проте його реалізація методу run – порожня. Тож програміст у своєму коді просто заміщає метод run:

public class HelloThread extends Thread {

    public void run() {

        System.out.println("Привіт - це нитка!");

    }

    public static void main(String args[]) {

        (new HelloThread()).start();

    }

}

Як бачимо, в обох випадках для створення нової нитки викликається метод Thread.start.

Рекомендованим є перший спосіб, оскільки він дозволяє нам розширити ще якийсь клас у нашому класі (в Java відсутнє множинне успадкування, тож неможливо розширити декілька класів).

Виконання нитки можна призупинити за допомогою методу sleep класу Thread. Можливо також перервати виконання нитки з іншої нитки за допомогою методу interrupt. Скориставшись методом join, ми можемо задати час очікування на завершення виконання іншої нитки (нескінченно або вказаний час). Наступний приклад демонструє роботу двох ниток. Основна (main) нитка запускає виконання іншої нитки, яка просто виводить важливе повідомлення по одному рядку через кожні 4 секунди. Основна нитка виконання кожної секунди виводить повідомлення, що вона все ще очікує на завершення породженої нитки. Якщо виконання породженої нитки триває більше періоду часу, що заданий у змінній patience (терпіння), то нитка перериває виконання породженої нитки (закінчується терпіння). При перериванні породженої нитки, у ній виникає виняток типу InterruptedException, який обробляється нею за допомогою конструкції try-catch.


 

 

Відеозапис лекції:

 

 

Частина 1: Робота з мережею

https://drive.google.com/file/d/182EXB6FRr3YJgDpxzQV5_Q7UOZBrXNwW/view

 

На сьогоднішній день клієнти служб миттєвого обміну повідомленнями (instant messenger) стали незамінним інструментом для всіх користувачів інтернету. Існує безліч різних протоколів і клієнтів, про які кожен чув і які ми всі щодня використовуємо. Але не всі знають, що покладено в основу їх роботи. Припустимо, ви встановили один з клієнтів служб миттєвого обміну повідомленнями на ваш комп'ютер. Після його запуску і введення імені і пароля вашого користувача, програма намагається підключитися до сервера. Що саме означає слово "підключитися"?

Кожен комп'ютер в мережі має IP-адресу. Ця електронна адреса схожа на вашу домашню адресу вона однозначно ідентифікує ваш комп'ютер і дозволяє іншим спілкуватися з вашим комп'ютером. Хоча існує й інший спосіб ідентифікації комп'ютерів в мережі доменне ім'я, яке зручніше й наочніше ідентифікує комп'ютер, ніж простий набір чисел (наприклад, www.quizful.net). В інтернеті існують спеціальні комп'ютери, які здійснюють перетворення доменного імені в IP-адресу і навпаки.

На одному комп'ютері може паралельно виконуватись кілька програм. Припустимо, що ви запустили 10 програм на своєму комп'ютері, і всі вони очікують, щоб інші комп'ютери зв'язалися з ними. Можете уявити собі це так: вас 10 осіб у великому офісі з одним телефоном і всі чекають дзвінків від їх власних клієнтів. Як вирішити цю проблему? Можна звичайно призначити відповідального працівника і він буде приносити телефон людині, якій телефонують, але тоді інші клієнти не зможуть додзвонитися до інших людей. Крім того, це дуже важко і безглуздо мати відповідального працівника для маршрутизації дзвінків. Ви, мабуть, уже здогадалися, до чого я веду – якщо всі ці програми, що виконуються на одному комп'ютері, просять своїх клієнтів зв'язатися з ними за певною IP-адресою, то клієнти не будуть задоволені. Ідея полягає в наступномумати окрему IP-адресу для кожної програми, правильно? Неправильно! Тоді може окремих телефонних номерів буде достатньо? Так! На мережевому жаргоні "окремі телефонні номери" мають назву порти.

 

Порт – це просто число і кожна з програм, яка виконується на певному комп'ютері, може вибрати унікальний порт, щоб відкрити себе для зовнішнього світу. Запам'ятайте – ці порти ви не зможете знайти серед апаратних засобів комп'ютера (навіть не намагайтеся їх шукати). Ці числа – логічні.

 

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

Якщо скласти докупи все сказане, то отримаємо:

  IP-адреса + порт-число = _____

Іншими словами:

_____ = унікально визначає програму в мережі.

_____ – це і є … СОКЕТ!

Підіб'ємо підсумки, сокетце комбінація IP-адреси і порту. Сокет-адреса надає можливість іншим комп'ютерам в мережі знаходити певну програму, яка виконується на певному комп'ютері. Ви можете відображати сокет-адресу наступним чином: 64.104.137.58:80, де 64.104.137.58 IP-адреса і 80 порт.

Досить про теорію, давайте перейдемо до дій. Розробимо дуже простий і наочний код на Java, який продемонструє можливості використання сокетів:

Серверний код:

import java.net.*;

import java.io.*;

public class Server {

   public static void main(String[] ar)    {

     int port = 6666; // випадковий порт (від 1025 до 65535)

       try {

         ServerSocket ss = new ServerSocket(port); // створюємо серверний сокет

         System.out.println("Waiting for a client...");

         Socket socket = ss.accept(); // чекаємо на під’єднання

         System.out.println("Got a client :) ... Finally, someone saw me!");

         System.out.println();

 // отримуємо вхідний та вихідний потоки для спілкування

         InputStream sin = socket.getInputStream();

         OutputStream sout = socket.getOutputStream();

 // полегшуємо обробку текстових повідомлень

         DataInputStream in = new DataInputStream(sin);

         DataOutputStream out = new DataOutputStream(sout);

         String line = null;

         while(true) {

           line = in.readUTF(); // чекаємо на повідомлення

           System.out.println("The dumb client just sent me this line : " + line);

           System.out.println("I'm sending it back...");

           out.writeUTF(line); // відповідаємо тим же повідомленням

           out.flush(); // завершуємо передачу

           System.out.println("Waiting for the next line...");

           System.out.println();

         }

      } catch(Exception x) { x.printStackTrace(); }

   }

}

Клієнтський код:

import java.net.*;

import java.io.*;

public class Client {

    public static void main(String[] ar) {

        int serverPort = 6666; // порт сервера

        String address = "127.0.0.1"; // IP-адреса сервера

        try {

   InetAddress ipAddress = InetAddress.getByName(address);

// створюємо об’єкт IP-адреси

           System.out.println("Any of you heard of a socket with IP address " + address +

" and port " + serverPort + "?");

            Socket socket = new Socket(ipAddress, serverPort); // створюємо сокет

            System.out.println("Yes! I just got hold of the program.");

            // отримуємо потоки

            InputStream sin = socket.getInputStream();

            OutputStream sout = socket.getOutputStream();

            // полегшуємо обробку текстових повідомлень

            DataInputStream in = new DataInputStream(sin);

            DataOutputStream out = new DataOutputStream(sout);

            // створюємо потік для читання з клавіатури

BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));

            String line = null;

            System.out.println("Type in something and press enter");

            System.out.println();

            while (true) {

                line = keyboard.readLine(); // чекаємо вводу користувача

                System.out.println("Sending this line to the server...");

                out.writeUTF(line); // надсилаємо на сервер

                out.flush(); // завершуємо передачу

                line = in.readUTF(); // чекаємо сервера

                System.out.println("The server was very polite. It sent me this : " + line);

                System.out.println("Looks like the server is pleased with us.");

                System.out.println();

            }

        } catch (Exception x) {

            x.printStackTrace();

        }

    }

}


 

 

Відеозапис лекції:

 

 

Частина 1: Розробка додатків для платформи Netbeans

https://drive.google.com/file/d/1LwlmEXo0hof4lZdpW53eTJ0dtzcb0FHO/view

 

Платформа NetBeans – це платформа Java, на якій можуть базуватись масштабні додатки для робочого середовища.

 

Саме середовище IDE NetBeans є одним із сотень додатків на основі платформи NetBeans. Платформа NetBeans містить інтерфейси API, які спрощують обробку вікон, дій, файлів і багатьох інших об'єктів, а також функцій, типових для додатків.

Кожна можливість в додатку на платформі NetBeans може забезпечуватись окремим модулем NetBeans, який можна порівняти з модулем, що підключається.

 

Модуль NetBeans – це група класів Java, яка надає додаток з певними можливостями.

 

Користувачі також можуть створювати власні модулі для середовища IDE NetBeans. Наприклад, користувачі можуть створювати модулі, що забезпечують доступ до популярних технологій та сервісів для користувачів IDE NetBeans. Також можна створити, наприклад, модуль, який буде надавати додаткові функції редагування.

Під час відеолекції було продемонстровано створення простих застосунків на платформі NetBeans з використанням стандартних шаблонів, які входять до складу IDE.

Детальні кроки процесу можна переглянути в офіційній документації платформи – https://college.page.link/o2Qt.

Також на офіційному сайті IDE доступні навчальна карта з платформи NetBeans (https://college.page.link/uo7u) і галерея додатків, створених на цій платформі (https://college.page.link/kmtB).

 

8.4. Розповсюдження додатків для платформи Netbeans. Інсталятори. Bootstrap. портативні додатки

 

Відеозапис лекції:

 

 

Частина 1: Створення додатків для платформи Netbeans

https://drive.google.com/file/d/1FWAYD8MPWK96iJ8A3fF38Z6AE3yAlgrS/view

 

Платформа NetBeans – це платформа Java, на якій можуть базуватись масштабні додатки для робочого середовища.

 

Саме середовище IDE NetBeans є одним з сотень додатків на основі платформи NetBeans. Платформа NetBeans містить інтерфейси API, які спрощують обробку вікон, дій, файлів і багатьох інших об'єктів, а також функцій, типових для додатків.

 

Одна з чудових можливостей NetBeans – можливість створення інсталяційних пакетів для програм, створених з допомогою цього середовища (не обов’язково з використанням однойменної платформи).

 

Вбудовані засоби створення інсталяторів були вперше представлені як частина пакета SDK JavaFX 2.2, що дозволяє упакувати програму у вигляді інсталятора, а потім встановити та запустити програму без будь-яких зовнішніх залежностей на системному JRE або JavaFX SDK. Згодом ця можливість стала доступною і для проєктів Java SE.

NetBeans не змінює модель розгортання вашої програми: він сприймає програму такою, якою вона є, упаковує її разом з середовищем виконання Java і створює інсталятор, стандартний для операційної системи, яку ви використовуєте. Суть полягає в тому, щоб зробити все це незалежним від того, що мають користувачі Java на цільовій машині. Ви можете взяти такий інсталятор і запустити його на машині, де немає Java, й він встановить і додаток, і все необхідне для виконання Java. Розмір таких інсталяторів досить великий, тому що навіть "Привіт, світ"-додаток потягне за собою значну частину артефактів виконання Java.

В ході відеолекції було продемонстровано створення інсталяційних пакетів з допомогою NetBeans, а також – за допомогою популярних відкритих інсталяторів Inno Setup та Free Extractor. Ще один варіант – використання WiX Toolset.

Детальні кроки процесу можна переглянути на сайті IDEhttps://college.page.link/f4Ud.

 

Додаткові матеріали

1. Основи програмування на Java – безкоштовний відеокурс (Prometheus): https://courses.prometheus.org.ua/courses/EPAM/JAVA101/2016_T2/about

2. Java Professional – авторський відеокурс (Бабич О.В, ITVDN): https://www.youtube.com/watch?v=H77pBuf582M&list=PLvItDmb0sZw9DXLBDs4IBcalvA1Nx56o9

3. Основи програмування на Java – безкоштовний відеокурс (Prometheus): https://courses.prometheus.org.ua/courses/EPAM/JAVA101/2016_T2/about

4. Java Professional – авторський відеокурс (Бабич О.В, ITVDN): https://www.youtube.com/watch?v=H77pBuf582M&list=PLvItDmb0sZw9DXLBDs4IBcalvA1Nx56o9

5. Основи програмування на Java – безкоштовний відеокурс (Prometheus): https://courses.prometheus.org.ua/courses/EPAM/JAVA101/2016_T2/about

6. Java Professional – авторський відеокурс (Бабич О.В, ITVDN):

7. Основи програмування на Java – безкоштовний відеокурс (Prometheus):

8. Java Professional – авторський відеокурс (Бабич О.В, ITVDN): https://www.youtube.com/watch?v=H77pBuf582M&list=PLvItDmb0sZw9DXLBDs4IBcalvA1Nx56o9

9. Основи програмування на Java – безкоштовний відеокурс (Prometheus): https://courses.prometheus.org.ua/courses/EPAM/JAVA101/2016_T2/about

10. Java Professional – авторський відеокурс (Бабич О.В, ITVDN): https://www.youtube.com/watchv=H77pBuf582M&list=PLvItDmb0sZw9DXLBDs4IBcalvA1Nx56o9

 

 

Попередня тема

На початок