Estou trabalhando em um aplicativo que toca música.
Durante a reprodução, muitas vezes as coisas precisam acontecer em threads separados porque precisam acontecer simultaneamente. Por exemplo, as notas de uma necessidade de acordes para ser ouvido em conjunto, de modo que cada um é atribuído o seu próprio segmento a ser jogado em (Edit para esclarecer:. Chamada note.play()
congela o fio até que a nota é feito jogando, e é por isso que eu preciso de três tópicos separados para ouvir três notas ao mesmo tempo.)
Esse tipo de comportamento cria muitos tópicos durante a reprodução de uma peça musical.
Por exemplo, considere uma peça musical com uma melodia curta e uma progressão curta de acordes. A melodia inteira pode ser tocada em um único segmento, mas a progressão precisa de três segmentos para tocar, pois cada um de seus acordes contém três notas.
Portanto, o pseudo-código para reproduzir uma progressão fica assim:
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
Então, supondo que a progressão tenha 4 acordes e a toque duas vezes, do que estamos abrindo 3 notes * 4 chords * 2 times
= 24 threads. E isso é apenas para jogar uma vez.
Na verdade, funciona bem na prática. Não percebo latência perceptível ou bugs resultantes disso.
Mas eu queria perguntar se essa é uma prática correta ou se estou fazendo algo fundamentalmente errado. É razoável criar tantos threads cada vez que o usuário aperta um botão? Caso contrário, como posso fazer isso de maneira diferente?
Is it reasonable to create so many threads...
depende do modelo de encadeamento do idioma. Os threads usados para paralelismo são geralmente tratados no nível do SO, para que o SO possa mapeá-los para vários núcleos. Tais threads são caros para criar e alternar entre eles. Os encadeamentos para simultaneidade (intercalar duas tarefas, não necessariamente executando as duas simultaneamente) podem ser implementados no nível do idioma / VM e podem ser extremamente "baratos" para produzir e alternar entre eles, para que você possa, digamos, falar com 10 soquetes de rede mais ou menos simultaneamente, mas você não necessariamente terá mais taxa de transferência de CPU dessa maneira.