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 ạ?
Xử lý luồng: Tự đóng luồng B1 khi gọi luồng B2
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 ạ?
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 . 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
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