VietTuts

Tự Học Lập Trình Online

  • Home
  • Java
  • Servlet
  • JSP
  • Struts2
  • Hibernate
  • Spring
  • MyBatis
  • Java WS
  • C
  • C++
  • C#
  • Python
  • PHP
  • Excel
  • VBA
  • Web
    • JavaScript
    • JQUERY
    • JSON
    • AJAX
    • CSS
    • HTML
    • HTML5
    • Node.js
    • Angular 7
  • SQL
    • MySQL
    • SQL Server
  • Misc
    • Eclipse
    • Phần mềm tiện ích
    • Cấu trúc DL&GT
    • Selenium Test
Java Cơ Bản Các Khái Niệm Java OOPs Java String Xử Lý Ngoại Lệ Các Lớp Lồng Nhau

Đa Luồng (Multithreading)

Java Thread Đa luồng trong java Vòng đởi của Thread Tạo Thread Thread Scheduler Sleep một thread Start một thread hai lần Gọi phương thức run() Phương thức join() Đặt tên cho thread Mức ưu tiên của một Thread Luồng hiểm Thread Pool Thread Group Shutdown Hook Thực hiện nhiều task Garbage Collection Lớp Runtime

Java Synchronization

Phương thức synchronization Khối synchronized Đồng bộ static Deadlock trong java Giao tiep giua cac thread Interrupt một Thread
Java AWT Java Swing Java I/O Ví Dụ Java I/O Lập Trình Mạng Với Java Java Date Chuyển Đối Kiểu Dữ Liệu Java Collections Java JDBC Các Tính Năng Mới Trong Java Bài Tập Java Có Lời Giải Câu Hỏi Phỏng Vấn Java
1 / 3
❮ ❯

Giao tiếp giữa các thread trong Java


Deadlock trong java
Interrupt một thread trong java

Giao tiếp giữa các thread trong Java (Inter-thread communication) là một kỹ thuật cho phép các luồng đồng bộ để giao tiếp với nhau.

Giao tiếp giữa các thread là một cơ chế trong đó thread bị tạm dừng chạy trong session quan trọng của nó và một thread khác được phép xen vào (hoặc khóa) trong cùng một session quan trọng sẽ được thực hiện. Nó được thực hiện bằng các phương thức sau của lớp Object :

  • wait()
  • notify()
  • notifyAll()

1. Phương thức wait()

Làm cho luồng hiện tại giải phóng khóa và đợi cho đến khi một thread khác gọi phương thức notify() hoặc phương thức notifyAll() cho đối tượng này, hoặc một chờ đợi khoảng thời gian xác định.

Thread hiện tại phải sở hữu monitor của đối tượng này, vì vậy nó phải được gọi từ phương thức synchronized nếu không nó sẽ xảy ra ngoại lệ.

Phương thứcMô tả
public final void wait() throws InterruptedExceptionChờ đợi cho đến khi đối tượng được thông báo.
public final void wait(long timeout) throws InterruptedExceptionChờ đợi một khoảng thời gian cụ thể.

2. Phương thức notify()

Đánh thức luồng duy nhất đang chờ trên monitor của đối tượng này. Nếu có nhiều luồng nào đó đang chờ đối tượng này, một trong số chúng sẽ được đánh thức. Sự lựa chọn là độc đoán và xảy ra theo quyết định của bản cài đặt. Cú pháp:

public final void notify()

3. Phương thức notifyAll()

Đánh thức tất cả các luồng đang chờ trên monitor của đối tượng này. Cú pháp:

public final void notifyAll()

Quá trình giao tiếp giữa các thread trong java

quá trình giao tiếp giữa các thread trong java

Giải thích sơ đồ trên

  1. Luồng nhập vào để có được khóa.
  2. Khóa được chiếm bởi một luồng.
  3. Bây giờ luồng đi vào trạng thái chờ nếu bạn gọi phương thức wait() trên đối tượng. Nếu không, nó sẽ giải phóng khóa và thoát ra.
  4. Nếu bạn gọi notify() hoặc notifyAll(), luồng sẽ chuyển đến trạng thái được thông báo (trạng thái chạy được)
  5. Hiện luồng có sẵn để có được khóa.
  6. Sau khi hoàn thành nhiệm vụ, luồng sẽ giải phóng khóa và thoát khỏi trạng thái monitor của đối tượng.

Tại sao các phương thức wait(), notify() và notifyAll() được định nghĩa trong lớp Object mà không phải lớp Thread?

Đó là bởi vì chúng liên quan đến khóa và đối tượng có một khóa.


Nội dung chính

  • Sự khác nhau giữa wait và sleep
  • Ví dụ về giao tiếp giữa các thread trong java

Sự khác nhau giữa wait và sleep

Hãy xem sự khác biệt quan trọng giữa phương thức wait và sleep.

wait()sleep()
Phương thức wait() giải phóng khóaPhương thức sleep() không giải phóng khóa.
là phương thức của lớp Objectlà phương thức của lớp Thread
là phương thức non-staticlà phương thức static
nên được đánh thức bởi các phương thức notify() hoặc notifyAll()Sleep hoàn thành sau một khoảng thời gian nhất định.

Ví dụ về giao tiếp giữa các thread trong java

Hãy xem ví dụ đơn giản về giao tiếp giữa các thread trong java như dưới đây.

File: Test.java

class Customer {
    int amount = 10000;

    synchronized void withdraw(int amount) {
        System.out.println("Rút tiền...");

        if (this.amount < amount) {
            System.out.println("Tài khoản không đủ; đợi gửi tiền...");
            try {
                wait();
            } catch (Exception e) {
            }
        }
        this.amount -= amount;
        System.out.println("Hoàn thành rút tiền!");
    }

    synchronized void deposit(int amount) {
        System.out.println("Gửi tiền...");
        this.amount += amount;
        System.out.println("Hoàn thành gửi tiền!");
        notify();
    }
}

public class Test {
    public static void main(String args[]) {
        final Customer c = new Customer();
        new Thread() {
            public void run() {
                c.withdraw(15000);
            }
        }.start();
        new Thread() {
            public void run() {
                c.deposit(10000);
            }
        }.start();
    }
}

Output:

Rút tiền...
Tài khoản không đủ; đợi gửi tiền...
Gửi tiền...
Hoàn thành gửi tiền!
Hoàn thành rút tiền!

Deadlock trong java
Interrupt một thread trong java

Recent Updates

Xuất dữ liệu ra màn hình console trong JavaCài đặt môi trường JavaJava Swing - Bài tập quản lý sinh viên trong javaLinkedList trong javaArrayList trong javaBài tập java có lời giảiSử dụng Javascript trong HTMLToán tử dấu 2 chấm (::) trong Java 8Lambda Expression - Biểu thức Lambda trong java 8Bài tập Java - Sắp xếp nhanh (Quick Sort) trong JavaBài tập Java - Sắp xếp chèn (Insertion Sort) trong JavaBài tập Java - Sắp xếp nổi bọt (Bubble Sort) trong JavaSắp Tết 2026 Rồi! - Còn bao nhiêu ngày nữa là đến tết 2026?

VietTuts on facebook

Học Lập Trình Online Miễn Phí - VietTuts.Vn
Danh Sách Bài Học

Học Java | Hibernate | Spring
Học Excel | Excel VBA
Học Servlet | JSP | Struts2
Học C | C++ | C#
Học Python
Học SQL

Bài Tập Có Lời Giải

Bài tập Java
Bài tập C
Bài tập C++
Bài tập C#
Bài tập Python
Ví dụ Excel VBA

Câu Hỏi Phỏng Vấn

201 câu hỏi phỏng vấn java
25 câu hỏi phỏng vấn servlet
75 câu hỏi phỏng vấn jsp
52 câu hỏi phỏng vấn Hibernate
70 câu hỏi phỏng vấn Spring
57 câu hỏi phỏng vấn SQL

Scroll back to top

Copyright © 2016 VietTuts.Vn all rights reserved. | Liên hệ | Chính sách - riêng tư | sitemap.html | sitemap_index.xml