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 BT1659

MultiThread - Synchronized trong Java - Đồng bộ 3 threads - Sinh số ngẫu nhiên, bình phương, và chia hết



#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();
        }
    }
    
}


Liên kết rút gọn:

https://gokisoft.com/1659

Bình luận