30/09/2018, 20:05

Xử lý luồng trong java

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 ạ?

... viết 22:15 ngày 30/09/2018

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.

Bảo Ngọc viết 22:15 ngày 30/09/2018

'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 ạ?

Nguyen Ca viết 22:19 ngày 30/09/2018

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

Bảo Ngọc viết 22:19 ngày 30/09/2018

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

Nguyen Ca viết 22:16 ngày 30/09/2018

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

... viết 22:19 ngày 30/09/2018

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

Leng Keng viết 22:18 ngày 30/09/2018

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

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!!!");
    }
}
Bài liên quan
0