The enterprise bean must not attempt to manage threads. The enterprise bean must not attempt to start, stop, suspend, or resume a thread, or to change a thread’s priority or name. The enterprise bean must not attempt to manage thread groups.
[EJB 3.1 spec, page 599]

With Java EE 6 you don't have to create threads to execute a java.lang.Runnable asynchronously. Just implement an Executor as EJB 3.1:

It seems that the fact that your TransactionalExecutor implements Executor is irrelevant: TransactionalExecutor could implement another interface or not implement an interface at all. The only relevant bits are that 1) TransactionalExecutor is an SLSB, 2) has a method (execute(), in your example) that takes the block of code to execute as an argument (in the form of a Runnable, in your example) and that 3) that method is annotated with @Asynchronous. Correct?