2017-07-03 1 views
1

Ich bin auf der Suche nach einer bestimmten Reihe von Operationen mit nur einem Thread durchzuführen. Allerdings kann Executors.newSingleThreadExecutor nicht mit einem zwischengespeicherten Thread aus einer Map arbeiten.Einzel-Thread-Executor mit einem Cache-Thread

import org.junit.Test; 

import java.util.HashMap; 
import java.util.Map; 
import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ThreadFactory; 

public class ThreadTest { 
    private final Callable<Boolean> task = new Callable() { 
     @Override 
     public Boolean call() { 
      System.out.println("Ran"); 
      return Boolean.TRUE; 
     } 
    }; 

    //this prints the Callable output "Ran" 
    @Test 
    public void testVanilla() throws InterruptedException { 
     ExecutorService service = Executors.newSingleThreadExecutor(); 
     service.submit(task); 
     Thread.sleep(10); 
    } 

    //this does not print the Callable output "Ran" 
    @Test 
    public void testCached() throws InterruptedException { 
     Map<String, Thread> map = new HashMap<>(); 
     Thread thread = new Thread("WORKER"); 
     thread.setDaemon(false); 
     map.put("uniq", thread); 
     ExecutorService service = Executors.newSingleThreadExecutor(new ThreadFactory() { 
      @Override 
      public Thread newThread(Runnable r) { 
       return map.get("WORKER"); 
      } 
     }); 

     service.submit(task); 
     Thread.sleep(10); 
    } 
} 

Gibt es etwas offensichtlich falsch? Ich frage mich, warum der Executor nicht im Fall # 2 funktioniert

+0

Typo oben. map.put ("WORKER", Thread); funktioniert nicht – qwerty

+0

"Ich frage mich, warum der Executor nicht im Fall # 2 gearbeitet hat" Können Sie das näher ausführen? – bradimus

+0

testCached() gibt nicht aus "Ran" zeigt an, dass die Callable nicht aufgerufen wurde – qwerty

Antwort

1

Ihr Thread hat keine ausführbare um die aufrufbar aufzurufen. Dieser Code funktioniert gut für mich

@Test 
    public void testCached() throws InterruptedException { 
     Map<String, Thread> map = new HashMap<>(); 
     ExecutorService service = Executors.newSingleThreadExecutor(new ThreadFactory() { 
      @Override 
      public Thread newThread(Runnable r) { 

       if (!map.containsKey("WORKER")) { 
        Thread thread = new Thread(r, "WORKER"); 
        thread.setDaemon(false); 
        map.put("WORKER", thread); 
       } 

       return map.get("WORKER"); 
      } 
     }); 

     service.submit(task); 
     Thread.sleep(10); 
    }