Demonstration of processing a queue of no-op threads
You could skip the join loop here

for t in threads:
    t.join()

while not que.empty():      
    out.append(que.get())


and let Queue.get wait instead:

for _ in range(len(threads)):
    out.append(que.get())


And no, you don't need an explicit threading.Lock in this program because Queue handles the synchronization.

Note that for i in range(1, repeat) loops repeat-1 times, which is probably not what you meant.