中性款舒适客房Java高级多线程
大家好 我需要帮助解决java多线程问题 这是一间男女皆宜的舒适房间,问题在于中性款舒适客房Java高级多线程,java,windows,multithreading,Java,Windows,Multithreading,大家好 我需要帮助解决java多线程问题 这是一间男女皆宜的舒适房间,问题在于 创造一个男女皆宜的舒适房间 如果有男性在场,男性可以进入(反之亦然) 如果男性使用女性,则女性不能进入(反之亦然) 合理使用 没有饥饿 到目前为止,我找到了一些接近的东西,但我有一个关于合理使用的问题,男性使用女性不能进入和饥饿。这件事我需要帮助 import java.util.Random; import java.util.concurrent.Semaphore; public class Try2 ext
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,但它只是让整个线程都处于睡眠状态。我想要的是一个控制器线程,它有两个队列,一个是男性,一个是女性。在中,至少还有一个线程生成人员并将其添加到控制器队列中。这些人可以在一段随机的时间内自己睡觉