{"id":1377,"date":"2024-05-22T12:29:59","date_gmt":"2024-05-22T05:29:59","guid":{"rendered":"https:\/\/unydevelopernetwork.com\/?p=1377"},"modified":"2024-05-22T12:29:59","modified_gmt":"2024-05-22T05:29:59","slug":"membaca-dan-mensinkronisasi-file-teks-dengan-multithreading-di-java","status":"publish","type":"post","link":"https:\/\/unydevelopernetwork.com\/index.php\/2024\/05\/22\/membaca-dan-mensinkronisasi-file-teks-dengan-multithreading-di-java\/","title":{"rendered":"Membaca dan Mensinkronisasi File Teks dengan Multithreading di Java"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 8<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>\n<p>Dalam dunia pemrograman, efisiensi dan kecepatan adalah dua aspek yang sering kali diutamakan, terutama ketika berhadapan dengan operasi I\/O yang memakan waktu, seperti membaca file. Java, dengan dukungan kuatnya terhadap multithreading, menawarkan cara yang efisien untuk menangani tugas-tugas ini secara paralel. Pada artikel kali ini, kita akan membahas bagaimana Anda bisa menggunakan multithreading untuk membaca dua file teks secara simultan dan kemudian mensinkronisasi konten mereka. Tutorial ini cocok bagi Anda yang ingin meningkatkan kinerja aplikasi yang berinteraksi dengan sistem file.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Dalam postingan kali ini, kita akan langsung bermain dengan User Interface. Karena Multithreading tiada berarti jika kita tidak sekalian bermain dengan User Interface. Mengapa? Karena dengan menerapkan User Interface ke dalam project multithread kita, Secara otomatis kita akan melihat langsung bagaimana multithread itu bekerja. Tidak hanya struktural seperti saat menggunakan interface terminal yang mana satu instruksi tidak akan dapat dieksekusi sebelum instruksi sebelumnya dieksekusi. Itulah alasannya mengapa kita akan langsung menggunakan User Interface pada project kita kali ini. <\/p>\n\n\n\n<p><strong>KELUARAN<\/strong><\/p>\n\n\n\n<p>Keluaran dari project kita kali ini adalah seperti tangkapan layar di bawah ini. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"508\" height=\"406\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image.png\" alt=\"\" class=\"wp-image-1378\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image.png 508w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-300x240.png 300w\" sizes=\"auto, (max-width: 508px) 100vw, 508px\" \/><figcaption class=\"wp-element-caption\">Gambar 1. Tampilan akhir dari Project Membaca dan Mensinkronisasi Dua File Teks.<\/figcaption><\/figure>\n<\/div>\n\n\n<p><strong>FLOW PROGRAM<\/strong><\/p>\n\n\n\n<p>Karena pada project kali ini kita akan menerapkan multithread dan User interface, maka diperlakukan skenario Flow Program yang akan kita terapkan. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"409\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-1-700x409.png\" alt=\"\" class=\"wp-image-1379\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-1-700x409.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-1-300x175.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-1-768x449.png 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-1-850x497.png 850w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-1.png 893w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption class=\"wp-element-caption\">Gambar 2. Flow Program Membaca dan Mensinkronisasi Dua File Teks<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Dalam aplikasi yang kita kembangkan, pengguna dapat menambahkan dan memproses dua file teks menggunakan antarmuka yang intuitif. Proses ini digambarkan dalam UML Sequence Diagram yang kita bahas di bawah ini, yang menggambarkan interaksi antara pengguna dan sistem selama eksekusi aplikasi.<\/p>\n\n\n\n<p><em><strong>Langkah-langkah Utama dan Aplikasi<\/strong><\/em><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Memulai Aplikasi<\/strong>: Pengguna memulai aplikasi yang memperlihatkan sebuah <code>Main Frame<\/code> dengan dua tombol utama: &#8220;Tambahkan File&#8221; dan &#8220;Proses&#8221;.<\/li>\n\n\n\n<li><strong>Menambahkan File<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Pengguna mengklik tombol &#8220;Tambahkan File&#8221;, yang memicu <code>Main Frame<\/code> untuk membuka <code>File Selector<\/code>.<\/li>\n\n\n\n<li><code>File Selector<\/code> adalah JFileChooser yang memungkinkan pengguna memilih dua file teks dari sistem file lokal.<\/li>\n\n\n\n<li>Setelah file dipilih, path dari kedua file tersebut dikembalikan ke <code>Main Frame<\/code> dan ditampilkan dalam bentuk teks, menunjukkan file yang telah terpilih.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Memproses File<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Dengan file sudah ditambahkan, pengguna kemudian dapat mengklik tombol &#8220;Proses&#8221;.<\/li>\n\n\n\n<li><code>Main Frame<\/code> memulai <code>File Reader<\/code> yang bertugas membaca isi dari kedua file yang dipilih.<\/li>\n\n\n\n<li>Selama proses berlangsung, <code>Progress Bar<\/code> di-update secara real time untuk memberikan umpan balik visual kepada pengguna mengenai kemajuan proses.<\/li>\n\n\n\n<li><code>Progress Bar<\/code> menampilkan status proses pembacaan dan sinkronisasi, yang memberikan pengalaman interaktif kepada pengguna.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Menyimpan File Hasil<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Setelah proses pembacaan dan sinkronisasi selesai, <code>File Reader<\/code> memicu <code>File Saver<\/code> untuk menyimpan hasil.<\/li>\n\n\n\n<li><code>File Saver<\/code> menampilkan JFileChooser yang memungkinkan pengguna untuk memilih lokasi dan nama file untuk menyimpan hasil output.<\/li>\n\n\n\n<li>Pengguna memilih lokasi dan nama file, dan hasil proses disimpan ke lokasi yang dipilih.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Penutupan Aplikasi<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Setelah file berhasil disimpan, aplikasi dapat ditutup atau digunakan untuk sesi lebih lanjut jika diinginkan.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>Diagram yang disajikan pada Gambar 2 membantu dalam memahami alur kerja aplikasi secara keseluruhan dan interaksi antar komponen. Ini termasuk bagaimana komponen-komponen seperti <code>Main Frame<\/code>, <code>File Selector<\/code>, <code>File Reader<\/code>, <code>Progress Bar<\/code>, dan <code>File Saver<\/code> berinteraksi satu sama lain selama siklus hidup aplikasi.<\/p>\n\n\n\n<p><strong>MULAI MEMPROGRAM<\/strong><\/p>\n\n\n\n<p><em>1. Membuat Class FileReaderThread.java<\/em><\/p>\n\n\n\n<p>Kelas ini bertanggung jawab untuk membaca isi dari file teks yang diberikan. Mari kita ulas metodologi yang digunakan:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Constructor<\/strong>: Menerima path file sebagai parameter. Ini menyimpan path ke variabel lokal yang akan digunakan untuk membaca file.<\/li>\n\n\n\n<li><strong>run()<\/strong>: Metode ini di-override dari kelas <code>Thread<\/code>. Di dalamnya, kita membuka file menggunakan <code>BufferedReader<\/code>, membaca setiap baris sampai akhir file, dan menyimpannya ke dalam <code>StringBuilder<\/code>. Ini memastikan bahwa operasi I\/O dilakukan di thread terpisah, sehingga tidak mengganggu responsivitas GUI.<\/li>\n\n\n\n<li><strong>getFileContent()<\/strong>: Setelah file selesai dibaca, metode ini digunakan untuk mendapatkan isi file sebagai string.<\/li>\n<\/ul>\n\n\n\n<p>Berikut adalah kodenya<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.io.*;\n\nclass FileReaderThread extends Thread {\n    private String filePath;\n    private StringBuilder fileContent = new StringBuilder();\n\n    public FileReaderThread(String filePath) {\n        this.filePath = filePath;\n    }\n\n    public void run() {\n        try {\n            BufferedReader reader = new BufferedReader(new FileReader(filePath));\n            String line;\n            while ((line = reader.readLine()) != null) {\n                fileContent.append(line).append(\"\\n\");\n                \/\/ Tambahkan sleep untuk memperlambat proses\n                Thread.sleep(100); \/\/ Tunda 100 ms untuk setiap baris\n            }\n            reader.close();\n        } catch (IOException e) {\n            e.printStackTrace();\n        } catch (InterruptedException e) {\n            System.out.println(\"Thread was interrupted.\");\n        }\n    }\n\n    public String getFileContent() {\n        return fileContent.toString();\n    }\n}<\/code><\/pre>\n\n\n\n<p><em>2. Membuat Class FileSyncApp.java<\/em><\/p>\n\n\n\n<p>Kelas ini adalah jantung dari aplikasi GUI kita. Berikut adalah penjelasan untuk setiap komponen dan metode:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Konstruktor <code>FileSyncApp<\/code><\/strong>: Di sini, kita mengatur tampilan utama aplikasi, termasuk membuat buttons, labels, progress bar, dan text area. Layout diatur menggunakan <code>FlowLayout<\/code>, yang sederhana dan cukup untuk kebutuhan kita.<\/li>\n\n\n\n<li><strong>ActionListener untuk <code>addButton<\/code><\/strong>: Ketika tombol &#8220;Tambahkan File&#8221; diklik, <code>JFileChooser<\/code> akan dibuka, memungkinkan pengguna untuk memilih dua file. Setelah file dipilih, nama file ditampilkan di label dan path disimpan untuk proses lebih lanjut.<\/li>\n\n\n\n<li><strong>ActionListener untuk <code>processButton<\/code><\/strong>: Ini memulai proses pembacaan file. Tombol ini mengaktifkan progress bar dan memulai thread baru yang menjalankan metode <code>processFiles<\/code>.<\/li>\n\n\n\n<li><strong>processFiles(String path1, String path2)<\/strong>: Metode ini menangani logika untuk memulai thread pembacaan file. Setelah kedua thread selesai, ia meng-update text area dengan isi file dan menghentikan progress bar.<\/li>\n\n\n\n<li><strong>saveToFile(String content)<\/strong>: Setelah file selesai diproses, metode ini memungkinkan pengguna untuk menyimpan konten ke file baru melalui <code>JFileChooser<\/code>.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><em>Penjelasan GUI Components:<\/em><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>JButton<\/strong>: Dua tombol untuk interaksi pengguna &#8211; satu untuk menambahkan file dan satu lagi untuk memulai proses sinkronisasi.<\/li>\n\n\n\n<li><strong>JLabel<\/strong>: Dua label untuk menampilkan nama file yang dipilih.<\/li>\n\n\n\n<li><strong>JProgressBar<\/strong>: Sebuah bar untuk memberikan feedback visual tentang proses yang sedang berlangsung.<\/li>\n\n\n\n<li><strong>JTextArea<\/strong>: Area teks di mana konten file yang diproses ditampilkan.<\/li>\n<\/ul>\n\n\n\n<p>Berikut adalah Kodenya.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import javax.swing.*;\nimport java.awt.*;\nimport java.awt.event.*;\nimport java.io.*;\n\npublic class FileSyncApp extends JFrame {\n    private JButton addButton;\n    private JButton processButton;\n    private JLabel fileLabel1;\n    private JLabel fileLabel2;\n    private JProgressBar progressBar;\n    private JLabel statusLabel;\n    private String filePath1;\n    private String filePath2;\n    private JTextArea textArea;\n\n    public FileSyncApp() {\n        super(\"File Synchronization Application\");\n        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n        setSize(500, 400);\n        setLocationRelativeTo(null);\n        setLayout(new FlowLayout());\n\n        addButton = new JButton(\"Tambahkan File\");\n        processButton = new JButton(\"Proses\");\n        fileLabel1 = new JLabel(\"Teks 1: \");\n        fileLabel2 = new JLabel(\"Teks 2: \");\n        progressBar = new JProgressBar(0, 100);\n        progressBar.setPreferredSize(new Dimension(350, 25));\n        statusLabel = new JLabel(\"Status: Idle\");\n        textArea = new JTextArea(10, 35);\n        textArea.setEditable(false);\n\n        add(addButton);\n        add(processButton);\n        add(fileLabel1);\n        add(fileLabel2);\n        add(progressBar);\n        add(statusLabel);\n        add(new JScrollPane(textArea));\n\n        addButton.addActionListener(new ActionListener() {\n            public void actionPerformed(ActionEvent e) {\n                JFileChooser fileChooser = new JFileChooser();\n                fileChooser.setMultiSelectionEnabled(true);\n                int option = fileChooser.showOpenDialog(FileSyncApp.this);\n                if (option == JFileChooser.APPROVE_OPTION) {\n                    File&#91;] files = fileChooser.getSelectedFiles();\n                    if (files.length == 2) {\n                        filePath1 = files&#91;0].getAbsolutePath();\n                        filePath2 = files&#91;1].getAbsolutePath();\n                        fileLabel1.setText(\"Teks 1: \" + files&#91;0].getName());\n                        fileLabel2.setText(\"Teks 2: \" + files&#91;1].getName());\n                    }\n                }\n            }\n        });\n\n        processButton.addActionListener(new ActionListener() {\n            public void actionPerformed(ActionEvent e) {\n                progressBar.setIndeterminate(true);\n                statusLabel.setText(\"Processing...\");\n                Thread thread = new Thread(new Runnable() {\n                    public void run() {\n                        processFiles(filePath1, filePath2);\n                    }\n                });\n                thread.start();\n            }\n        });\n    }\n\n    private void processFiles(String path1, String path2) {\n        FileReaderThread reader1 = new FileReaderThread(path1);\n        FileReaderThread reader2 = new FileReaderThread(path2);\n\n        reader1.start();\n        reader2.start();\n\n        try {\n            reader1.join();\n            reader2.join();\n\n            SwingUtilities.invokeLater(new Runnable() {\n                public void run() {\n                    textArea.setText(reader1.getFileContent() + \"\\n\" + reader2.getFileContent());\n                    progressBar.setIndeterminate(false);\n                    statusLabel.setText(\"Done Processing.\");\n                    saveToFile(textArea.getText());\n                }\n            });\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n\n    private void saveToFile(String content) {\n        JFileChooser fileChooser = new JFileChooser();\n        if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {\n            File file = fileChooser.getSelectedFile();\n            try {\n                BufferedWriter writer = new BufferedWriter(new FileWriter(file));\n                writer.write(content);\n                writer.close();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p><em>3. Method Main<\/em><\/p>\n\n\n\n<p>Metode ini adalah titik masuk program, yang hanya mengatur agar instance <code>FileSyncApp<\/code> ditampilkan. Tambahkan metode ini di class <code>FileSyncApp<\/code>.<\/p>\n\n\n\n<p>Berikut adalah metodenya.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    public static void main(String&#91;] args) {\n        SwingUtilities.invokeLater(new Runnable() {\n            public void run() {\n                new FileSyncApp().setVisible(true);\n            }\n        });\n    }<\/code><\/pre>\n\n\n\n<p>Sehingga kode lengkap dari adalah <code>FileSyncApp<\/code> sebagai berikut.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import javax.swing.*;\nimport java.awt.*;\nimport java.awt.event.*;\nimport java.io.*;\n\npublic class FileSyncApp extends JFrame {\n    private JButton addButton;\n    private JButton processButton;\n    private JLabel fileLabel1;\n    private JLabel fileLabel2;\n    private JProgressBar progressBar;\n    private JLabel statusLabel;\n    private String filePath1;\n    private String filePath2;\n    private JTextArea textArea;\n\n    public FileSyncApp() {\n        super(\"File Synchronization Application\");\n        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n        setSize(500, 400);\n        setLocationRelativeTo(null);\n        setLayout(new FlowLayout());\n\n        addButton = new JButton(\"Tambahkan File\");\n        processButton = new JButton(\"Proses\");\n        fileLabel1 = new JLabel(\"Teks 1: \");\n        fileLabel2 = new JLabel(\"Teks 2: \");\n        progressBar = new JProgressBar(0, 100);\n        progressBar.setPreferredSize(new Dimension(350, 25));\n        statusLabel = new JLabel(\"Status: Idle\");\n        textArea = new JTextArea(10, 35);\n        textArea.setEditable(false);\n\n        add(addButton);\n        add(processButton);\n        add(fileLabel1);\n        add(fileLabel2);\n        add(progressBar);\n        add(statusLabel);\n        add(new JScrollPane(textArea));\n\n        addButton.addActionListener(new ActionListener() {\n            public void actionPerformed(ActionEvent e) {\n                JFileChooser fileChooser = new JFileChooser();\n                fileChooser.setMultiSelectionEnabled(true);\n                int option = fileChooser.showOpenDialog(FileSyncApp.this);\n                if (option == JFileChooser.APPROVE_OPTION) {\n                    File&#91;] files = fileChooser.getSelectedFiles();\n                    if (files.length == 2) {\n                        filePath1 = files&#91;0].getAbsolutePath();\n                        filePath2 = files&#91;1].getAbsolutePath();\n                        fileLabel1.setText(\"Teks 1: \" + files&#91;0].getName());\n                        fileLabel2.setText(\"Teks 2: \" + files&#91;1].getName());\n                    }\n                }\n            }\n        });\n\n        processButton.addActionListener(new ActionListener() {\n            public void actionPerformed(ActionEvent e) {\n                progressBar.setIndeterminate(true);\n                statusLabel.setText(\"Processing...\");\n                Thread thread = new Thread(new Runnable() {\n                    public void run() {\n                        processFiles(filePath1, filePath2);\n                    }\n                });\n                thread.start();\n            }\n        });\n    }\n\n    private void processFiles(String path1, String path2) {\n        FileReaderThread reader1 = new FileReaderThread(path1);\n        FileReaderThread reader2 = new FileReaderThread(path2);\n\n        reader1.start();\n        reader2.start();\n\n        try {\n            reader1.join();\n            reader2.join();\n\n            SwingUtilities.invokeLater(new Runnable() {\n                public void run() {\n                    textArea.setText(reader1.getFileContent() + \"\\n\" + reader2.getFileContent());\n                    progressBar.setIndeterminate(false);\n                    statusLabel.setText(\"Done Processing.\");\n                    saveToFile(textArea.getText());\n                }\n            });\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n\n    private void saveToFile(String content) {\n        JFileChooser fileChooser = new JFileChooser();\n        if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {\n            File file = fileChooser.getSelectedFile();\n            try {\n                BufferedWriter writer = new BufferedWriter(new FileWriter(file));\n                writer.write(content);\n                writer.close();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n    }\n\n    public static void main(String&#91;] args) {\n        SwingUtilities.invokeLater(new Runnable() {\n            public void run() {\n                new FileSyncApp().setVisible(true);\n            }\n        });\n    }\n}<\/code><\/pre>\n\n\n\n<p><strong>MENGOMPILASI PROGRAM<\/strong><\/p>\n\n\n\n<p>Langkah selanjutnya adalah mengkompilasi program sehingga program Java yang sudah kita buat dapat dijalankan. Untuk melakukannya, buka terminal pada komputer Anda dan navigasikan ke tempat Anda menyimpan kedua file Java yang telah dibuat. Setelah Anda berada di lokasi tempat Anda menyimpan kedua file java, Anda dapat mengetikkan perintah berikut ini.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>javac FileSyncApp.java <\/code><\/pre>\n\n\n\n<p>Seperti tangkapan layar di bawah ini<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"519\" height=\"23\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-2.png\" alt=\"\" class=\"wp-image-1380\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-2.png 519w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-2-300x13.png 300w\" sizes=\"auto, (max-width: 519px) 100vw, 519px\" \/><figcaption class=\"wp-element-caption\">Gambar 3. Contoh Penggunaan Perintah Javac<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Setelah Anda mengeksekusi perintah di atas, maka Anda akan melihat bahwa class yang diperoleh lebih banyak daripada file java yang sudah kita buat. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"168\" height=\"69\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-3.png\" alt=\"\" class=\"wp-image-1381\"\/><figcaption class=\"wp-element-caption\">Gambar 4. File Java sebelum dikompilasi<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"184\" height=\"223\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-4.png\" alt=\"\" class=\"wp-image-1382\"\/><figcaption class=\"wp-element-caption\">Gambar 5. File Java setelah dikompilasi<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Kita tidak perlu mengkompilasi keseluruhan file Java yang sudah kita buat. Kita hanya perlu memgompilasi file Java yang memiliki metode main. Maka secara otomatis seluruh File Java yang berkaitan juga akan ikut terkompilasi. <\/p>\n\n\n\n<p><strong>MENJALANKAN PROGRAM<\/strong><\/p>\n\n\n\n<p>Setelah kita berhasil mengompilasi File Java yang sudah kita buat, saatnya kita menjalankannya. Untuk menjalankannya kita hanya perlu mengetikkan berikut ini di area terminal yang sama. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>java FileSyncApp<\/code><\/pre>\n\n\n\n<p>Jika tidak terjadi error, maka secara otomatis perintah ini akan menjalankan program FileSyncApp yang sudah kita buat. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"536\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-5-700x536.png\" alt=\"\" class=\"wp-image-1383\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-5-700x536.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-5-300x230.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-5.png 718w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption class=\"wp-element-caption\">Gambar 6. Program FileSyncApp Berhasil Dijalankan<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Lalu, di manakah letak multithreadnya? Coba kita buka system monitor \/ task manager yang ada di komputer kita masing-masing.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"561\" height=\"371\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-6.png\" alt=\"\" class=\"wp-image-1384\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-6.png 561w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-6-300x198.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-6-350x230.png 350w\" sizes=\"auto, (max-width: 561px) 100vw, 561px\" \/><figcaption class=\"wp-element-caption\">Gambar 7. FileSyncApp Menjalankan 29 Threads<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Ya, dapat kita lihat dari tangkapan layar di atas, bahwa program FileSyncApp menjalankan 29 Threads sekaligus bersama-sama untuk membaca, mensinkronisasi file, menampilkan progress update, dan menghandle error. <\/p>\n\n\n\n<p>Lalu, bagaimana sih program ini berjalan? Simak video berikut ini sampai akhir.<\/p>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video height=\"618\" style=\"aspect-ratio: 935 \/ 618;\" width=\"935\" controls src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/Screen-Recording-2024-05-22-at-12.24.46.mov\"><\/video><figcaption class=\"wp-element-caption\">Video 1. Jalannya Program FileSyncApp.<\/figcaption><\/figure>\n\n\n\n<p><strong>PENUTUP<\/strong><\/p>\n\n\n\n<p>Menarik bukan? kini kita sudah mampu membuat aplikasi Java Multithread lengkap dengan User Interfacenya. Untuk selanjutnya, Anda dapat berkreasi sesuai dengan kreatifitas Anda.<\/p>\n\n\n\n<p>Bagaimana? apakah sudah paham dengan tutorial ini? Jika Anda masih belum paham, Anda dapat meninggalkan komentar di kolom komentar postingan ini. Bahkan, jika Anda memiliki masalah pemrograman yang lain dan menarik untuk di bahas, Anda juga dapat mengirimkannya melalui kolom komentar postingan ini.<\/p>\n\n\n\n<p>Semoga postingan bermanfaat bagi Anda para pembaca. Apabila ada pertanyaan mengenai postingan ini, Anda dapat meninggalkannya di kolom komentar. Dan, Apabila Anda menemukan artikel ini berguna, Anda dapat membagikannya. Anda juga dapat mencuplik beberapa bagian dari artikel ini, namun jangan lupa untuk sertakan URL nya. Terima kasih.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">^_^<\/h2>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 8<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Dalam dunia pemrograman, efisiensi dan kecepatan adalah dua aspek yang sering kali diutamakan, terutama ketika berhadapan dengan operasi I\/O yang memakan waktu, seperti membaca file. Java, dengan dukungan kuatnya terhadap multithreading, menawarkan&#8230;<\/p>\n","protected":false},"author":1,"featured_media":1383,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,2],"tags":[150,26,5,350,351,349,72,59],"class_list":["post-1377","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","category-tutorial","tag-algoritma","tag-algoritma-pemrograman","tag-java","tag-java-swing","tag-java-ui","tag-multithread","tag-pemrograman","tag-programming"],"featured_image_src":"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-5.png","author_info":{"display_name":"Muhammad Irfan Luthfi","author_link":"https:\/\/unydevelopernetwork.com\/index.php\/author\/admin\/"},"jetpack_featured_media_url":"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2024\/05\/image-5.png","jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts\/1377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/comments?post=1377"}],"version-history":[{"count":1,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts\/1377\/revisions"}],"predecessor-version":[{"id":1386,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts\/1377\/revisions\/1386"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/media\/1383"}],"wp:attachment":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/media?parent=1377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/categories?post=1377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/tags?post=1377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}