2013-06-18 2 views
0

У меня есть что-то вроде этогоExecutorService.execute() не возвращает тип резьбы

public static void runThread(Thread t){ 
    ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); 
    threadExecutor.execute(t); 
} 

если я Thread.currentThread(), то я вернусь weblogic.work.ExecuteThread или иногда java.lang.Thread (я использовал Weblogic как мой AppServer), но если я

public static void runThread(Thread t){ 
    //ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); 
    //threadExecutor.execute(t); 
    t.start(); 
} 

тогда, когда я DOD Thread.currentThread(), я получаю обратно com.my.thread.JSFExecutionThread, что нить, что я прошел в, и это то, что я хочу. Есть ли способ исправить, так что ExecutorService#execute() вернет правильный тип темы, например Thread#start()? Дело в том, что я хочу использовать ExecutorService, потому что я хочу использовать shutdown() и shutdownNow()

EDIT

Что случилось с этой реализации?

/** 
* Run {@code Runnable runnable} with {@code ExecutorService} 
* @param runnable {@code Runnable} 
* @return 
*/ 
public static ExecutorService runThread(Thread t){ 
    ExecutorService threadExecutor = Executors.newSingleThreadExecutor(
      new ExecutionThreadFactory(t)); 
    threadExecutor.execute(t); 
    return threadExecutor; 
} 

private static class ExecutionThreadFactory implements ThreadFactory{ 
    private JSFExecutionThread jsfThread; 
    ExecutionThreadFactory(Thread t){ 
     if(t instanceof JSFExecutionThread){ 
      jsfThread = (JSFExecutionThread)t; 
     } 
    } 

    @Override 
    public Thread newThread(Runnable r) { 
     if(jsfThread != null){ 
      return jsfThread; 
     }else{ 
      return new Thread(r); 
     } 
    } 
} 
+2

Нет, поскольку, если вы используете 'ExecutorService.execute (t)', он выполняется в потоке 'ExecutorService', а не' t'. Обратите внимание, что 'ExecutorService.execute' принимает' Runnable', а не только 'Thread'. – johnchen902

+0

@ johnchen902: Даже с помощью 'ThreadFactory'? –

+0

@ThangPham Я не уверен. Но я изменю свой дизайн, если столкнусь с этим. – johnchen902

ответ

2

Что случилось с этой реализации?

Да.

Во-первых, ExecutorService управляет жизни каждого Thread от времени ThreadFactory создает его, пока исполнитель не будет сделано с ним ... и кульминационный пункт, а Thread не пригодна для повторного использования, как только он прекратил это не может начать.

Второй

public Thread newThread(Runnable r) { 
    if(jsfThread != null){ 
     return jsfThread; 
    }else{ 
     return new Thread(r); 
    } 
} 

Этот код нарушает договор ThreadFactory.newThread, не делая Runnabler установить в качестве работоспособной, которая будет выполнена в jsfThread.

 Смежные вопросы

  • Нет связанных вопросов^_^