Темы внутри потоков в Java? - PullRequest
9 голосов
/ 29 августа 2011

В настоящее время я думаю о том, как спроектировать многопоточную систему на 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 

Если нет, то кто-нибудь может предоставить теоретическое решение со ссылками?

Ответы [ 4 ]

9 голосов
/ 29 августа 2011

Да, вы можете запускать столько потоков, сколько хотите, но это, вероятно, не лучший способ. Гораздо лучше использовать неблокирующие API, чтобы вы могли начать выполнение какого-либо внешнего вызова, и вызывающий поток может немедленно начать делать что-то еще, не дожидаясь вызова сокета / базы данных, чтобы вернуться. Затем, когда возвращается вызов сокета / базы данных, вызывается обратный вызов для завершения этой обработки.

Неблокирующий ввод-вывод может обеспечить гораздо более высокую загрузку ЦП, поскольку вы просто инициируете вызовы и регистрируете обратные вызовы, и вам не нужно пытаться сбалансировать «правильное» количество одновременных потоков, которые в большинстве случаев просто спят.

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

3 голосов
/ 29 августа 2011

Чтобы ответить на вопрос, да, потоки могут запускать другие потоки.

Важна ли иерархия?

Возможно, вам лучше использовать ExecutorService с кэшированнымпул потоков.Таким образом, вы можете объединять потоки вместо создания лотов (что дорого).ExecutorServices также предоставляет другие интересные вещи, и использование Callables / Runnables с ними, вероятно, гораздо проще протестировать, чем копаться в потоках самостоятельно.

2 голосов
/ 29 августа 2011

Да, поток может запускать другой поток, и этот поток может запускать поток (ы) и так далее и далее ...

В методе потока run() можно создавать и запускать другие потоки.

0 голосов
/ 13 июля 2013

Возможно, например, вы можете создать поток и поместить идентификатор в массив следующим образом:

UnThread[] tab=   new  UnThread[10] ;

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

tab[i] = new UnThread();

После того, как вы можете передать на вкладку subMainThread массив

example

  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/

...