By GokiSoft.com|
19:41 15/06/2020|
Java Advanced
[Share Code] MultiThread - Synchronized trong Java - Đồng bộ 3 threads - Sinh số ngẫu nhiên, bình phương, và chia hết - Class C1907L
#Main.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package lession10;
/**
*
* @author Diep.Tran
*/
public class Main {
public static void main(String[] args) {
Thread1 t1 = new Thread1();
Thread2 t2 = new Thread2();
Thread3 t3 = new Thread3();
t1.start();
t2.start();
t3.start();
}
}
#SharedData.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package lession10;
/**
*
* @author Diep.Tran
*/
public class SharedData {
private static final int MAX = 200;
public static final int INDEX_THREAD_1 = 1;
public static final int INDEX_THREAD_2 = 2;
public static final int INDEX_THREAD_3 = 3;
int rad;
int total;
int index;
private static SharedData instance = null;
private SharedData() {
total = 0;
index = INDEX_THREAD_1;
}
public synchronized static SharedData getInstance() {
if(instance == null) {
instance = new SharedData();
}
return instance;
}
public int getRad() {
return rad;
}
public void setRad(int rad) {
this.rad = rad;
total += rad;
}
public boolean isRunning() {
return total <= 200;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
#Thread1.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package lession10;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Diep.Tran
*/
public class Thread1 extends Thread{
@Override
public void run() {
Random random = new Random();
while (SharedData.getInstance().isRunning()) {
synchronized(SharedData.getInstance()) {
int rad = random.nextInt(100) + 1;
System.out.println("T1 >> " + rad);
SharedData.getInstance().setRad(rad);
//Xac dinh xem luong dc duoc chay
if(rad % 3 == 0) {
//notify T2 duoc chay
SharedData.getInstance().setIndex(SharedData.INDEX_THREAD_2);
} else {
//notify T3 duoc chay
SharedData.getInstance().setIndex(SharedData.INDEX_THREAD_3);
}
//Thong bao cho T2, T3 chay
//T1 => di vao wait
SharedData.getInstance().notifyAll();
try {
SharedData.getInstance().wait();
} catch (InterruptedException ex) {
Logger.getLogger(Thread2.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
System.out.println("T1 Stop");
synchronized(SharedData.getInstance()) {
SharedData.getInstance().notifyAll();
}
}
}
#Thread2.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package lession10;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Diep.Tran
*/
public class Thread2 extends Thread{
@Override
public void run() {
while (SharedData.getInstance().isRunning()) {
synchronized(SharedData.getInstance()) {
//Kiem tra xem T2 > co duoc phep chay hay ko
SharedData.getInstance().notifyAll();
try {
while (SharedData.getInstance().isRunning() && SharedData.getInstance().getIndex() != SharedData.INDEX_THREAD_2) {
SharedData.getInstance().wait();
}
} catch (InterruptedException ex) {
Logger.getLogger(Thread2.class.getName()).log(Level.SEVERE, null, ex);
}
//Neu dc chay
int rad = SharedData.getInstance().getRad();
int r = rad * rad;
System.out.println("T2 >> So Binh Phuong >> " + r);
SharedData.getInstance().setIndex(SharedData.INDEX_THREAD_1);
}
}
System.out.println("T2 Stop");
synchronized(SharedData.getInstance()) {
SharedData.getInstance().notifyAll();
}
}
}
#Thread3.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package lession10;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Diep.Tran
*/
public class Thread3 extends Thread{
@Override
public void run() {
while (SharedData.getInstance().isRunning()) {
synchronized(SharedData.getInstance()) {
//T3 - Kiem tra xem co dc chay hay ko
SharedData.getInstance().notifyAll();
try {
while (SharedData.getInstance().isRunning() && SharedData.getInstance().getIndex() != SharedData.INDEX_THREAD_3) {
SharedData.getInstance().wait();
}
} catch (InterruptedException ex) {
Logger.getLogger(Thread2.class.getName()).log(Level.SEVERE, null, ex);
}
//T3 >> duoc chay
int rad = SharedData.getInstance().getRad();
if(rad % 4 == 0) {
System.out.println("T3 >> chia het cho 4");
} else {
System.out.println("T3 >> khong chia het cho 4");
}
SharedData.getInstance().setIndex(SharedData.INDEX_THREAD_1);
}
}
System.out.println("T3 Stop");
synchronized(SharedData.getInstance()) {
SharedData.getInstance().notifyAll();
}
}
}
Tags:
Phản hồi từ học viên
5
(Dựa trên đánh giá ngày hôm nay)