diff --git a/src/engine/workthreads/UpdateThread.java b/src/engine/workthreads/UpdateThread.java
index e29a4807..411fd3cd 100644
--- a/src/engine/workthreads/UpdateThread.java
+++ b/src/engine/workthreads/UpdateThread.java
@@ -17,6 +17,8 @@ import engine.objects.PlayerCharacter;
 import engine.objects.PlayerCombatStats;
 import org.pmw.tinylog.Logger;
 
+import java.util.concurrent.*;
+
 public class UpdateThread implements Runnable {
 
     private volatile Long lastRun;
@@ -27,36 +29,45 @@ public class UpdateThread implements Runnable {
     }
 
 
+    private static final long INSTANCE_DELAY = 1500; // Adjust as needed
+
     public void processPlayerUpdate() {
+        ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
 
         try {
-            for(PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()){
+            for (PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()) {
                 if (player != null) {
-                    player.update(true);
+                    Future<?> future = executor.submit(() -> {
+                        try {
+                            player.update(true);
+                        } catch (Exception e) {
+                            Logger.error(e);
+                        }
+                    });
+
+                    try {
+                        future.get(10, TimeUnit.SECONDS); // Enforce max execution time
+                    } catch (TimeoutException e) {
+                        Logger.error("Player update timed out for: " + player.getName());
+                        future.cancel(true); // Attempt to cancel the task
+                    } catch (Exception e) {
+                        Logger.error(e);
+                    }
                 }
             }
         } catch (Exception e) {
-            Logger.error("UPDATE ERROR",e);
+            Logger.error("UPDATE ERROR", e);
+        } finally {
+            executor.shutdown();
         }
-
-
     }
 
+    @Override
     public void run() {
-        lastRun = System.currentTimeMillis();
-        while (true) {
-            if (System.currentTimeMillis() >= lastRun + instancedelay) { // Correct condition
-                this.processPlayerUpdate();
-                lastRun = System.currentTimeMillis(); // Update lastRun after processing
-            }else {
-                try {
-                    Thread.sleep(1500); // Pause for 1500ms to reduce CPU usage
-                } catch (InterruptedException e) {
-                    Logger.error("Thread interrupted", e);
-                    Thread.currentThread().interrupt();
-                }
-            }
-            Thread.yield();
+        try {
+            processPlayerUpdate();
+        } catch (Exception e) {
+            Logger.error("Thread Execution Error", e);
         }
     }