title: Multithreading freezes when using `thread.join()`
body: <p>I am trying to set up 3 thread and execute 5 tasks in a queue. The idea is that the threads will first run the first 3 tasks at the same time, then 2 threads finish the remaining 2. But the program seems freeze. I couldn't detect anything wrong with it. </p>
  
  <pre><code>from multiprocessing import Manager
  import threading
  import time
  global exitFlag 
  exitFlag = 0
  
  
  class myThread(threading.Thread):
      def __init__(self, threadID, name, q):
          threading.Thread.__init__(self)
          self.threadID = threadID
          self.name = name
          self.q = q
  
      def run(self):
          print("Starting " + self.name)
          process_data(self.name, self.q)
          print("Exiting " + self.name)
  
  
  def process_data(threadName, q):
      global exitFlag
      while not exitFlag:
          if not workQueue.empty():
              data = q.get()
              print("%s processing %s" % (threadName, data))
          else:
              pass
          time.sleep(1)
      print('Nothing to Process')
  
  
  threadList = ["Thread-1", "Thread-2", "Thread-3"]
  nameList = ["One", "Two", "Three", "Four", "Five"]
  queueLock = threading.Lock()
  workQueue = Manager().Queue(10)
  threads = []
  threadID = 1
  
  # create thread
  for tName in threadList:
      thread = myThread(threadID, tName, workQueue)
      thread.start()
      threads.append(thread)
      threadID += 1
  
  # fill up queue
  queueLock.acquire()
  for word in nameList:
      workQueue.put(word)
  queueLock.release()
  
  # wait queue clear
  while not workQueue.empty():
      pass
  # notify thread exit
  exitFlag = 1
  # wait for all threads to finish
  for t in threads:
      t.join()
  print("Exiting Main Thread")
  </code></pre>
  
  <p>I don't know what happened exactly, but after I remove the <code>join()</code> part, the program is able to run just fun. What I don't understand is that exitFlag is supposed to have sent out the signal when the queue is emptied. So it seems somehow the signal was not detected by process_data()</p>