By GokiSoft.com| 19:00 07/06/2024|
Java Advanced

[Share Code] MultiThread - Sinh số ngẫu nhiên và hiển thị bình phương số ngẫu nhiên & Synchronized trong Java - C2307L

MultiThread - Sinh số ngẫu nhiên và hiển thị bình phương số ngẫu nhiên & Synchronized trong Java


#Main.java


/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.gokisoft.lesson03;

import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author teacher
 */
public class Main {

    public static void main(String[] args) {
        SharedData sharedData = new SharedData();

        Thread1 t1 = new Thread1(sharedData);
        Thread2 t2 = new Thread2(sharedData);

        t2.start();
        t1.start();
    }

    static class SharedData {

        int x;

        public SharedData() {
            x = 0;
        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }
    }

    static class Thread1 extends Thread {

        SharedData sharedData;

        public Thread1(SharedData sharedData) {
            this.sharedData = sharedData;
        }

        @Override
        public void run() {
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            Random random = new Random();

            synchronized (sharedData) {
                for (int i = 0; i < 10; i++) {
                    int rad = random.nextInt(1, 20);
                    sharedData.setX(rad);
                    System.out.println("T1 > " + rad);
//                try {
//                    Thread.sleep(2000);
//                } catch (InterruptedException ex) {
//                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
//                }
                    sharedData.notifyAll();
                    try {
                        sharedData.wait();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }

            System.out.println("T1 stop");

            synchronized (sharedData) {
                sharedData.notifyAll();
            }
        }
    }

    static class Thread2 extends Thread {

        SharedData sharedData;

        public Thread2(SharedData sharedData) {
            this.sharedData = sharedData;
        }

        @Override
        public void run() {
            synchronized (sharedData) {
                for (int i = 0; i < 10; i++) {
                    sharedData.notifyAll();
                    try {
                        sharedData.wait();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    int x = sharedData.getX() * sharedData.getX();
                    System.out.println("T2 > " + x);
//                try {
//                    Thread.sleep(1000);
//                } catch (InterruptedException ex) {
//                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
//                }
                }
            }

            System.out.println("T2 stop");
            synchronized (sharedData) {
                sharedData.notifyAll();
            }
        }

    }
}


#Test.java


/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.gokisoft.lesson03;

/**
 *
 * @author teacher
 */
public class Test {
    public static void main(String[] args) {
        SharedData data = new SharedData();
        
        //T1, T2, T3 -> queue
        synchronized (data) {
            //block code 1
        }
        
        //T4, T5, T6
        synchronized (data) {
            //block code 2
        }
        
        //Hieu nhu sau
        //queue: T1 (block 1), T2 (block 1), T4 (block 2), T5 (block 2), T6 (block2), T3 (block 1)
        //1) T1 -> running (xu ly code block 1)
        //2) T2 -> (block 1) -> running
        //3) T4 -> block 2 -> running
    }
    
    static class SharedData {
        //block code ...
    }
    
    /**
     * T1, T2, T3, T4, T5 -> invoke this function
     * 1) T1 -> running (T2, T3, T4, T5: waiting)
     */
    static synchronized void showSync() {
        System.out.println("block code ...");
    }
}


Tags:



Đăng nhập để làm bài kiểm tra

Chưa có kết quả nào trước đó