Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
中性款舒适客房Java高级多线程_Java_Windows_Multithreading - Fatal编程技术网

中性款舒适客房Java高级多线程

中性款舒适客房Java高级多线程,java,windows,multithreading,Java,Windows,Multithreading,大家好 我需要帮助解决java多线程问题 这是一间男女皆宜的舒适房间,问题在于 创造一个男女皆宜的舒适房间 如果有男性在场,男性可以进入(反之亦然) 如果男性使用女性,则女性不能进入(反之亦然) 合理使用 没有饥饿 到目前为止,我找到了一些接近的东西,但我有一个关于合理使用的问题,男性使用女性不能进入和饥饿。这件事我需要帮助 import java.util.Random; import java.util.concurrent.Semaphore; public class Try2 ext

大家好

我需要帮助解决java多线程问题 这是一间男女皆宜的舒适房间,问题在于

  • 创造一个男女皆宜的舒适房间
  • 如果有男性在场,男性可以进入(反之亦然)
  • 如果男性使用女性,则女性不能进入(反之亦然)
  • 合理使用
  • 没有饥饿
  • 到目前为止,我找到了一些接近的东西,但我有一个关于合理使用的问题,男性使用女性不能进入和饥饿。这件事我需要帮助

    import java.util.Random;
    import java.util.concurrent.Semaphore;
    
    public class Try2 extends Thread {
    
        public static Semaphore USERS = new Semaphore(0);
        public static Semaphore PUBLIC_CR = new Semaphore(0);
        public static Semaphore USAGE = new Semaphore(1);
    
        public static final int LIST = 3;
        public static int a = 0;
        public static int c = 0;
    
        public static int VACANCY = LIST;
    
        class MEN extends Thread {
    
            int iD;
            boolean notUsed = true;
    
            public MEN(int i) {
                iD = i;
            }
    
            public void run() {
                while (notUsed) {
                    try {
                        USAGE.acquire();
                        if (VACANCY > 0) {
                            System.out.println("MALE " + this.iD + " Is USING");
                            VACANCY--;
                            USERS.release();
                            USAGE.release();
                            try {
                                PUBLIC_CR.acquire();
                                notUsed = false;
                                this.USING_THE_CR();
                            } catch (InterruptedException ex) {
                            }
                        } else {
                            USAGE.release();
                            notUsed = false;
                        }
                    } catch (InterruptedException ex) {
                    }
                }
            }
    
            public void USING_THE_CR() {
                System.out.println("MALE " + this.iD + " is done USING the Comfort Room");
                try {
                    sleep(1000);
                } catch (InterruptedException ex) {
                }
            }
    
        }
    
        class WOMEN extends Thread {
    
            int iD;
            boolean notUsed = true;
    
            public WOMEN(int i) {
                iD = i;
            }
    
            public void run() {
                while (notUsed) {
                    try {
                        USAGE.acquire();
                        if (VACANCY > 0) {
                            System.out.println("FEMALE " + this.iD + " Is USING");
                            VACANCY--;
                            USERS.release();
                            USAGE.release();
                            try {
                                PUBLIC_CR.acquire();
                                notUsed = false;
                                this.USING_THE_CR();
                            } catch (InterruptedException ex) {
                            }
                        } else {
    
                            USAGE.release();
                            notUsed = false;
                        }
                    } catch (InterruptedException ex) {
                    }
                }
            }
    
            public void USING_THE_CR() {
                System.out.println("FEMALE " + this.iD + " is DONE USING the Comfort Room");
                try {
                    sleep(1000);
                } catch (InterruptedException ex) {
                }
            }
    
        }
    
        class BATHROOM extends Thread {
    
            public BATHROOM() {
            }
    
            public void run() {
                while (true) {  // runs in an infinite loop
                    try {
                        USERS.acquire();
                        USAGE.release();
                        VACANCY++;
                        PUBLIC_CR.release();
                        USAGE.release();
                        this.USING();
                    } catch (InterruptedException ex) {
                    }
                }
            }
    
            public void USING() {
                System.out.println("The Comfort Room is occupied");
                try {
                    sleep(1000);
                } catch (InterruptedException ex) {
                }
            }
        }
    
        public static void main(String args[]) {
    
            Try2 BR = new Try2();
            BR.start();  // Let the simulation begin
        }
    
        public void run() {
            BATHROOM b = new BATHROOM();  //WORKING THREADS ON BATHROOM
            b.start();
    
            /* THIS WILL GENERATE THE USERS*/
            for (int i = 1; i < 16; i++) {
    
                Random random = new Random();
                int temp = random.nextInt(2);
                if (temp == 0) {
                    a++;
    
                    MEN m = new MEN(a);
                    m.start();
    
                } else {
                    c++;
                    WOMEN w = new WOMEN(c);
                    w.start();
    
                }
    
                try {
                    sleep(2000);
                } catch (InterruptedException ex) {
                };
            }
        }
    }
    
    import java.util.Random;
    导入java.util.concurrent.Semaphore;
    公共类Try2扩展线程{
    公共静态信号量用户=新信号量(0);
    公共静态信号量public_CR=新信号量(0);
    公共静态信号量用法=新信号量(1);
    公共静态最终整数列表=3;
    公共静态int a=0;
    公共静态int c=0;
    公共静态int空缺=列表;
    班上的人延长了时间{
    int-iD;
    布尔值notUsed=true;
    公职人员(国际一){
    iD=i;
    }
    公开募捐{
    while(未使用){
    试一试{
    用法:acquire();
    如果(空缺>0){
    System.out.println(“男性”+this.iD+“正在使用”);
    空缺--;
    USERS.release();
    用法.release();
    试一试{
    公开获取;
    未使用=错误;
    这个。使用_THE_CR();
    }捕获(中断异常例外){
    }
    }否则{
    用法.release();
    未使用=错误;
    }
    }捕获(中断异常例外){
    }
    }
    }
    使用_-CR()的公共无效{
    System.out.println(“男性”+此iD+“使用舒适室完成”);
    试一试{
    睡眠(1000);
    }捕获(中断异常例外){
    }
    }
    }
    阶级妇女延伸线{
    int-iD;
    布尔值notUsed=true;
    公共妇女(int i){
    iD=i;
    }
    公开募捐{
    while(未使用){
    试一试{
    用法:acquire();
    如果(空缺>0){
    System.out.println(“女性”+this.iD+“正在使用”);
    空缺--;
    USERS.release();
    用法.release();
    试一试{
    公开获取;
    未使用=错误;
    这个。使用_THE_CR();
    }捕获(中断异常例外){
    }
    }否则{
    用法.release();
    未使用=错误;
    }
    }捕获(中断异常例外){
    }
    }
    }
    使用_-CR()的公共无效{
    System.out.println(“女性”+此iD+“使用舒适室完成”);
    试一试{
    睡眠(1000);
    }捕获(中断异常例外){
    }
    }
    }
    类浴室延长线{
    公共浴室(){
    }
    公开募捐{
    而(true){//在无限循环中运行
    试一试{
    USERS.acquire();
    用法.release();
    空缺++;
    公开发布();
    用法.release();
    这个。使用();
    }捕获(中断异常例外){
    }
    }
    }
    使用()公开作废{
    System.out.println(“舒适室被占用”);
    试一试{
    睡眠(1000);
    }捕获(中断异常例外){
    }
    }
    }
    公共静态void main(字符串参数[]){
    Try2 BR=新的Try2();
    BR.start();//让模拟开始
    }
    公开募捐{
    浴室b=新浴室();//浴室上的工作线程
    b、 start();
    /*这将生成用户*/
    对于(int i=1;i<16;i++){
    随机=新随机();
    内部温度=随机下一个温度(2);
    如果(温度==0){
    a++;
    男性m=新男性(a);
    m、 start();
    }否则{
    C++;
    妇女w=新妇女(c);
    w、 start();
    }
    试一试{
    睡眠(2000年);
    }捕获(中断异常例外){
    };
    }
    }
    }
    
    不确定您是否真的需要三个线程,但是,您需要某种队列(男人和女人)。然后你需要某种控制器来决定谁能进入,谁不能。您可能还需要与每个人相关联的某种“到达”时间,这样您就不会让人们等待更长的时间(即,等待时间最长的人应该是首选)。你也可以使用某种平均计数器,当两个人等待相同的时间时,尝试确定公平性……你可能不需要不同的课程,称为男性和女性。他们在实际工作中非常相似。我认为你需要等待男人,直到他有空间。您应该使用通知等待机制,而不是睡眠。程序员时间到达时应该使用什么?我尝试使用sleep,但它只是让整个线程都处于睡眠状态。我想要的是一个控制器线程,它有两个队列,一个是男性,一个是女性。在中,至少还有一个线程生成人员并将其添加到控制器队列中。这些人可以在一段随机的时间内自己睡觉