Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat : room 종료 코드 수정 #46

Merged
merged 3 commits into from
Dec 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 20 additions & 10 deletions src/main/java/server/RoomThread.java
Original file line number Diff line number Diff line change
@@ -1,38 +1,48 @@
package server;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import server.manager.RoomManager;
import server.model.Room;

public class RoomThread implements Runnable {

private final BlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<>();
private final Room room;
private volatile boolean running = true;
private final RoomManager roomManager;

public RoomThread(Room room) {
public RoomThread(Room room, RoomManager roomManager) {
this.roomManager = roomManager;
this.room = room;
}

@Override
public void run() {
while (running) {
try {
Runnable task = taskQueue.take();
task.run();
// 방에 유저가 있는지 확인
checkRoomStatus();

// 1분마다 확인 (60초 대기)
Thread.sleep(60 * 1000); // 1분 대기
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}

public void addTask(Runnable task) {
taskQueue.offer(task);
/**
* 방에 유저가 있는지 확인하고, 없으면 쓰레드를 종료.
*/
private void checkRoomStatus() {
if (room.getCurrentPlayers() == 0) {
System.out.println("방 ID: " + room.getRoomId() + "에 사용자가 없습니다. 쓰레드를 종료합니다.");
roomManager.deleteRoom(room.getRoomId());
}
}

/**
* 방 쓰레드 종료
*/
public void stopThread() {
running = false;
taskQueue.offer(() -> {
}); // 큐를 깨워서 쓰레드 종료
}
}
2 changes: 1 addition & 1 deletion src/main/java/server/manager/RoomManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public boolean isDuplicateRoomName(String roomName) {
// 방 생성
public synchronized Room createRoom(String roomName, int maxPlayers, int hostUserId, int quizCount) {
int roomId = nextRoomId++;
Room room = new Room(roomId, roomName, maxPlayers, hostUserId, quizCount, userManager);
Room room = new Room(roomId, roomName, maxPlayers, hostUserId, quizCount, userManager,this);
room.startThread(); // Room 내부 쓰레드 시작
rooms.put(roomId, room);

Expand Down
14 changes: 7 additions & 7 deletions src/main/java/server/model/Room.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import server.RoomThread;
import server.manager.RoomManager;
import server.manager.UserManager;

public class Room {
Expand All @@ -31,14 +32,17 @@ public class Room {

private final UserManager userManager;

public Room(int roomId, String roomName, int maxPlayers, int hostUserId, int quizCount, UserManager userManager) {
private final RoomManager roomManager;

public Room(int roomId, String roomName, int maxPlayers, int hostUserId, int quizCount, UserManager userManager, RoomManager roomManager) {
this.roomId = roomId;
this.roomName = roomName;
this.maxPlayers = maxPlayers;
this.hostUserId = hostUserId;
this.quizCount = quizCount;
this.roomThread = new RoomThread(this);
this.roomThread = new RoomThread(this,roomManager);
this.userManager = userManager;
this.roomManager=roomManager;
}

// 방 쓰레드 시작
Expand All @@ -51,10 +55,6 @@ public void stopThread() {
roomThread.stopThread();
}

// 작업 추가
public void addTask(Runnable task) {
roomThread.addTask(task);
}

// 유저 추가
public synchronized boolean addUser(int userId, PrintWriter writer) {
Expand Down Expand Up @@ -205,7 +205,7 @@ public void setHostUserId() {
if (!userWriter.isEmpty()) {
this.hostUserId = userWriter.keySet().iterator().next();
} else {
this.roomThread.stopThread();
roomManager.deleteRoom(roomId);
}
}

Expand Down