Xử lý luồng: Tự đóng luồng B1 khi gọi luồng B2

Xin mọi người cho em hỏi :
em đang sử dụng phương thức A trong luồng B1.
giờ em muốn sử dụng phương thức A trong luồng B2 và đóng luồng B1
có cách nào để tự đóng luồng B1 khi mình gọi luồng B2 không ạ?

1 Like

Hình như có từ khóa synchronized

Nhưng dùng từ khóa này thì luồng B1 thực hiện xong phương thức A mới cho luồng B2 sử dụng phương thức A.

3 Likes
Thread t = new Thread() {
    @Override
    public void run() {
        String string = null;
        String newString = null;
        for (int i = 0; i < 1000; i++) {
            for (int j = 0; j < sensorList[element].getList().size(); j++) {
                newString = sensorList[element].getList().get(j).toString() + "\n";
synchronized(this){
                mainView.getTextArea().setText(string);}
                string = string + "\n" + newString;
                try {
                    sleep(10500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }
};

Ví dụ như mã trên em cũng dùng thử synchronized để đồng bộ khi xử dụng .getTextArea(). Nhưng khi em chạy 2 luồng vẫn chạy xong xong chứ không thực hiện xong 1 luồng mới đến luồng kia anh ạ? :frowning:

Tìm hiểu giữa sleep và wait() nha em. thường dùng wait() cho multi-thread-synchronization.

1 Like

Đại ca giờ mới thấy mặt :slight_smile: . multi-thread-synchronization nghĩa là sao hả anh?

nghĩa là đồng bộ hóa khi có nhiều luồng cùng chạy

2 Likes

Giả sử có 2 thread được tạo t1 và t2

Bạn thử dùng

t1.join();
t2.join();

xem thử nó có đồng bộ với nhau không

3 Likes

dùng wait() or notify(); bạn ơi. cái này là đồng bộ luồng.
bạn tham khảo code này coi không biết có phải cái bạn cần không :grin:

class MyThread implements Runnable {

    Thread thrd;
    String NameThread;
    boolean stop = false;
    boolean resume = false;
    int i=0;
    MyThread(String name) {
        NameThread = name;
        thrd = new Thread(this, NameThread);
        thrd.start();
    }

    public void run() {
        System.out.println("Luồng bắt đầu chạy....");
        for ( i = 0; i < 500; i++) {
            System.out.print(i + " ");
            if ((i % 10) == 0) {
                try {
                    System.out.println("");
                    Thread.sleep(250);
                } catch (Exception er) {
                    System.out.println(er);
                }

            }
            try {
                synchronized (this) {
                    if (resume) {
                        wait();
                    }
                    if (stop) {
                        break;
                    }
                }
            } catch (Exception er) {
                System.out.println(thrd.getName() + "Luồng bị ngắt!");
            }
        }
        System.out.println(thrd.getName() + "luồng kết thúc");

    }

    synchronized void stop() {
        stop = true;
        notify();//Thông báo thay đổi giá trị trong luồng
    }

    synchronized void pause() {
        resume = true;
        notify();
    }

    synchronized void resumeStop() {
        resume = false;
        notify();
    }
}

public class ThreadWaitNotify {

    public static void main(String[] args) throws InterruptedException {
        MyThread mt = new MyThread("My Thread");
        
            try {
                Thread.sleep(1000);
                mt.pause();

                System.out.println("Tạm dừng luồng");
                Thread.sleep(1000);
                System.out.println("Khôi phục luồng...");
                mt.resumeStop();

                Thread.sleep(1000);
                System.out.println("Tạm  dừng luồng.");
                mt.pause();
                Thread.sleep(1000);
                System.out.println("Khôi phục luồng.");
                mt.resumeStop();
                Thread.sleep(1000);
                    System.out.println("Kết thúc luồng");
                mt.stop();
               
            } catch (Exception er) {
                System.out.println("Luồng chính bị ngắt!");
            }
            try{
                mt.thrd.join();
                
            }catch(Exception er){
                System.out.println(er);
            }
        System.out.println("Luồng chính ngắt!!!");
    }
}
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?