diff --git a/websocket/__init__.py b/websocket/__init__.py
index d234ecf..516e57d 100644
--- a/websocket/__init__.py
+++ b/websocket/__init__.py
@@ -901,12 +901,8 @@ class WebSocketApp(object):
         self.keep_running = False
         self.sock.close()
 
-    def _send_ping(self, interval):
-        while True:
-            for i in range(interval):
-                time.sleep(1)
-                if not self.keep_running:
-                    return
+    def _send_ping(self, interval, event):
+        while not event.wait(interval):
             self.sock.ping()
 
     def run_forever(self, sockopt=None, sslopt=None, ping_interval=0):
@@ -935,7 +931,8 @@ class WebSocketApp(object):
             self._callback(self.on_open)
 
             if ping_interval:
-                thread = threading.Thread(target=self._send_ping, args=(ping_interval,))
+                event  = threading.Event()
+                thread = threading.Thread(target=self._send_ping, args=(ping_interval, event))
                 thread.setDaemon(True)
                 thread.start()
 
@@ -958,6 +955,8 @@ class WebSocketApp(object):
             self._callback(self.on_error, e)
         finally:
             if thread:
+                event.set()
+                thread.join()
                 self.keep_running = False
             self.sock.close()
             self._callback(self.on_close)