我目前正在考虑如何在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
如果没有人能提供参考的理论解决方案吗?
答案 0 :(得分:8)
是的,您可以根据需要启动任意数量的线程,但这可能不是最好的方法。使用非阻塞API会更好,这样你就可以开始执行一些外部调用,并且调用线程可以立即开始执行其他操作而无需等待socket / database调用返回。然后,当套接字/数据库调用返回时,将触发回调以完成该处理。
非阻塞I / O可以提供更高的CPU利用率,因为您只是触发调用并注册回调,而不必尝试平衡“正确”数量的并发线程,而这些并发线程大多只是在休眠状态。
答案 1 :(得分:3)
要回答这个问题,是的线程可以启动其他线程。
层次结构是否重要?
使用带有缓存线程池的ExecutorService可能会更好。这样你就可以汇集线程而不是创建批量(这很昂贵)。 ExecutorServices还提供了其他很酷的功能,使用Callables / Runnables可能比使用自己的线程更容易测试。
答案 2 :(得分:2)
是的,一个线程可以启动另一个线程,该线程可以启动线程,然后开启......
在线程的run()
方法中 - 您可以创建并启动其他线程。
答案 3 :(得分:0)
这是可能的 例如,你可以像这样创建线程并将id放在数组中
UnThread[] tab= new UnThread[10] ;
for ( int i=0;i<20;i++)
tab[i] = new UnThread();
您可以向subMainThread提供数组选项卡
为例
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/