Java中的线程内嵌线程?

12

我目前正在考虑如何在Java中设计一个需要进行一些重型网络处理和数据库存储的多线程系统。程序最初将启动三个基本线程。除了这些基本线程,我想从其中两个线程而不是主程序中启动其他线程。线程能否启动另一个线程,从而形成某种层次结构:

> Parent ->t0 thread1 -> t1 tread1.1  
>        ->t0 thread2
>        ->t0 thread3 -> t2 thread3.1

t0= inital time
t1,t2 = time at a point in the running thread
t1 != t2 

如果不行,是否有人可以提供一种带有参考文献的理论解决方案?


1
嗯,是的。你为什么不能呢?也许你可以试试看... - Brian Roach
我不确定你在问什么。无论线程运行在哪里,您都可以从任何Java代码创建新线程。这些线程需要保留对它们生成的其他线程的引用吗?您所描述的层次结构的目的是什么? - Russell
5个回答

10

是的,你可以启动尽可能多的线程,但这可能不是最好的方法。更好的方法是使用非阻塞API,以便启动某些外部调用的执行,并且调用线程可以立即开始做其他事情,而无需等待套接字/数据库调用返回。然后,当套接字/数据库调用返回时,将触发回调来完成该处理。

非阻塞I/O可以提供更优秀的CPU利用率,因为您只需触发调用并注册回调,而不必试图平衡大多数情况下仅处于睡眠状态的“正确”并发线程数。

http://www.owlmountain.com/tutorials/NonBlockingIo.htm

http://www.tensegrity.hellblazer.com/2008/03/non-blocking-jdbc-non-blocking-servlet-apis-and-other-high-mysteries.html


你知道我如何使我的线程继续运行而不受异常影响吗?异常似乎会停止线程(我正在捕获它们)。我尝试通过在一个线程内创建另一个线程来解决这个问题,但是从线程A创建的线程B中的异常会停止两个线程。两个线程的布尔标志在停止后仍保持为true。 - Lealo

6
回答这个问题,是的线程可以启动其他线程。
层次结构重要吗?
你最好使用具有缓存线程池的 ExecutorService。这样你就可以池化线程而不是创建很多线程(这是昂贵的)。ExecutorServices还提供其他很酷的东西,使用Callables / Runnables与它们一起可能比自己搞线程容易得多。

3

一个线程可以启动另一个线程,而那个线程也可以启动更多的线程,如此循环...

在一个线程的run()方法中,你可以创建并启动其他线程。


0

这是可能的,例如您可以创建线程并将ID放入数组中,就像这样:

UnThread[] tab=   new  UnThread[10] ;

for ( int i=0;i<20;i++)

tab[i] = new UnThread();

在你可以将数组tab传递给子主线程之后

例如

  while( tab[1].isAlive() ) {
  //do somthing..
  System.out.println("Ligne affichée par le main");
  try {
    // et faire une pause
    tab[1].sleep(800);
  }
  catch (InterruptedException ex) {}
 }

这里是一个简单的线程使用示例: http://kamel.berrayah.com/wordpress/2013/07/java-threads/


-1

所有线程都是在主线程下创建的,所以是可以的。


1
与之前的答案相比,没有什么新的东西,不是吗 ;) - kleopatra
我只是想提醒,即使我们只创建了一个线程,嵌套线程已经被创建,因为它们位于主线程内部。 - Amit Sharma
这并没有回答问题。一旦您获得足够的声望,您将能够评论任何帖子; 相反,提供不需要询问者澄清的答案。- 来自审查 - geanakuch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接