Yes, indeed when I replace t1.run() with t1.start() it does output: t1 threadgroup = mygroup t2 threadgroup = mygroup Thank you!
So this could be a fine solution as long as the third party libs don't override the ThreadGroup of the threads they create. If they do override the threadgroup, there is no way to have 1 log file per job correct? Thanks again for the help, Benjamin On Wed, Apr 24, 2019 at 11:33 AM Ralph Goers <[email protected]> wrote: > The relevant section is - > https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#Thread-java.lang.ThreadGroup-java.lang.Runnable- > < > https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#Thread-java.lang.ThreadGroup-java.lang.Runnable- > >. > > Your test isn’t valid because you have 3 threads. The first is the main > thread with a thread group of main, the second thread is created in the > first Thread but directly associated with thread group “my group”. The > third thread is created in thread “main” and so is in ThreadGroup main. > While you may have created the third Thread within the scope of the second > Thread Object, the code to create the third thread was not executed within > the execution of Thread 2 as this program only has a single thread of > execution. Thread 2 and 3 are never started. > > In other words Thread 3 must be executed from the call stack of Thread 2’s > run method while Thread 2 is in control of the execution. > > Ralph > > > On Apr 24, 2019, at 9:21 AM, Benjamin Jaton <[email protected]> > wrote: > > > > Could you point me to the relevant section? > > > > I did the following test: > > final ThreadGroup g = new ThreadGroup("mygroup"); > > Thread t1 = new Thread(g, () -> { > > Thread t2 = new Thread(() -> { }); > > System.out.println("t2 threadgroup = " + t2.getThreadGroup().getName()); > > }); > > System.out.println("t1 threadgroup = " + t1.getThreadGroup().getName()); > > t1.run(); > > > > And I get: > > t1 threadgroup = mygroup > > t2 threadgroup = main > > > > t2 is started from t1 yet didn't inherit the threadgroup. What am I > missing? > > > > On Wed, Apr 24, 2019 at 6:05 AM Apache <[email protected]> > wrote: > > > >> My reading of the javadoc for Thread indicates the do by default. > >> > >> Ralph > >> > >> On Apr 23, 2019, at 10:12 PM, Benjamin Jaton <[email protected]> > >> wrote: > >> > >>>> If you want all the threads in a “job” then I would create the parent > >>> thread with its own thread group and use the thread group name in the > >>> lookup. > >>> > >>> But how do I assign the thread group to threads that 3rd party > libraries > >>> create? I don't think child threads naturally inherit the ThreadGroup > of > >>> their parents. > >>> > >>> On Tue, Apr 23, 2019 at 8:36 PM Ralph Goers < > [email protected]> > >>> wrote: > >>> > >>>> I think the solution is pretty simple. The RoutingAppender doesn’t > only > >>>> work with the ThreadContext. It works using a lookup. So if you were > to > >> use > >>>> a ThreadLookup that used ${{thread:id}} you would get a new Appender > for > >>>> each thread id. To be honest, I am not sure why we haven’t created a > >>>> ThreadLookup before. I could easily see multiple places were the > thread > >> id, > >>>> name, priority or ThreadGroup name might want to be used. > >>>> > >>>> If you want all the threads in a “job” then I would create the parent > >>>> thread with its own thread group and use the thread group name in the > >>>> lookup. > >>>> > >>>> Ralph > >>>> > >>>>> On Apr 23, 2019, at 5:06 PM, Benjamin Jaton < > [email protected]> > >>>> wrote: > >>>>> > >>>>> Hello, > >>>>> > >>>>> Several times I've been in a situation where in a given JVM I am > trying > >>>> to > >>>>> run distinct jobs in separate threads, who themselves might spawn > their > >>>> own > >>>>> threads. > >>>>> In those situations I usually want the logging of each job in a > >> separate > >>>>> log file, and that has proven to be difficult. > >>>>> > >>>>> Log4j2 has a routing appender that allows to create a separate > appender > >>>> for > >>>>> each job given that you can provide a routing key that's unique for > >> each > >>>>> job. But what key to use for this? > >>>>> I've been using a ThreadContext variable that I set at the level of > the > >>>> job > >>>>> thread, and any child thread that I have control over. > >>>>> > >>>>> But the problem is that I don't always have control over this. > >> Sometimes > >>>>> third party APIs let you feed a custom ThreadFactory, sometimes they > >>>> don't. > >>>>> When they don't, I can't set that ThreadContext variable and part of > >> the > >>>>> job logging will be misrouted to a different appender. > >>>>> > >>>>> Is there a way to work around this so that there is 1 log file for > each > >>>> job > >>>>> that would gather all the logging of the sub threads? > >>>>> > >>>>> Thanks, > >>>>> Benjamin > >>>> > >>>> > >>>> > >>>> --------------------------------------------------------------------- > >>>> To unsubscribe, e-mail: [email protected] > >>>> For additional commands, e-mail: [email protected] > >>>> > >>>> > >> > >> > >> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: [email protected] > >> For additional commands, e-mail: [email protected] > >> > >> > >
