Threads, existe limite?

Boa tarde, pode parecer ingenuidade minha, (pouco tempo de java), mas posso executar várias threads em um único JFrame? Tenho uma aplicação que preciso que faça no minimo umas 14 tarefas, atualização de valores em labels, estou usando sem maiores problemas mas não sei se isso é correto ou causa alguns transtorno no sistema… Afinal existe um limite de Threads?

limite teorico ate aonde eu saiba existe mas depende de algumas particularidades do seu hardware. porem cada thread consome memoria e o processo pode morrer por falta de RAM.

agora a quantidade de threads não torna o seu programa “mais rapido” pq vc gasta tempo trocando de contexto entre as threads e vc tem locks que vão te levar a um limite de eficiencia. existem alguns modelos teoricos que dizem que N vezes o numero de nucleos do seu processador é um numero bom, em geral N = 2 ( salvo engano ).

existem opções para modificar o tamano da stack, etc.

muitas thread nao causam “transtorno” por si só. muito processamento e/ou uso de memoria que podem transtornar sistemas que nao conseguem isolar direito seus programas ( como quando seu browser usa 7gb de ram e trava tudo ).

roda esse programa, fonte: http://stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm-support

public class DieLikeADog {
    private static Object s = new Object();
    private static int count = 0;
    public static void main(String[] argv){
        for(;;){
            new Thread(new Runnable(){
                    public void run(){
                        synchronized(s){
                            count += 1;
                            System.err.println("New thread #"+count);
                        }
                        for(;;){
                            try {
                                Thread.sleep(1000);
                            } catch (Exception e){
                                System.err.println(e);
                            }
                        }
                    }
                }).start();
        }
    }
}

Certo meu codigo esta assim:

public class Tela1 extends javax.swing.JFrame {

public Tela1() {
        initComponents();
        setIcon();
        new Dpres().start();
        new Tpres().start();
        new Mov().start();
        new Serv3().start();
        new Serv2().start();
        new Serv1().start();

public class Dpres extends Thread { //tem mais 5 alem dessa, nesse mesmo modelo

        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(5000);
                    Calcular C = new Calcular();
                    C.setN1(Float.parseFloat(doisPMeta.getText()));
                    C.setN2(Float.parseFloat(doisPReal.getText()));

                    doisPGrap.setText(String.valueOf(C.Subtracao()));

                } catch (Exception e) {

                }
            }
        }
    }

Essa quantidade de threads seria ruim? Existe alguma maneira onde eu posso simplificar isso?

obrigado! vi seu link agora.

Existe um limite sim, mas quem determina esse limite é o sistema operacional e a CPU.
No Windows 7 por exemplo, eu consegui disparar pouco mais de mil Threads.

Mas você quer utilizar 14 Threads somente para atualizar campos em tela?
Não faz muito sentido… A menos que você tenha realmente 14 processos diferentes, executando concorrentemente.
Mas ainda considero mais interessante você ter um listener que atualize os campos quando necessário.

São 14 processos diferentes mesmo.

coisas q acho estranho nesse problema.

  1. usando swing é comum utilizar background threads http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

  2. usando swing, para manipular campos, etc, é comum esconder a complexidade de threads usando um modelo de programação orientado a eventos/listeners.

  3. se vc precisa fazer coisas periodicas, existe o conceito de main loop, como em um jogo, onde vc executa coisas em determinada ordem, dorme e depois recomeça.

da pra combinar 2 + 3 com um evento do tipo “batida de coração” onde toda a vez que geral recebe, todos executam alguma coisa.

agora esse papo de pegar a exception e esconder é coisa de guri de apartamento. ao menos coloca um e.printStackTrace();

'[quote=“Everton_Santos1, post:7, topic:337262, full:true”]
São 14 processos diferentes mesmo
[/quote]
E você não pode esperar os 14 terminarem e atualizar tudo de uma só vez?
Se não puder, eu sugiro criar listeners pra esses processos e esses listeners se encarregam de atualizar o que tem de ser atualizado.

Isso aí, eu sempre digo:
“Uma imagem vale mais que mil palavras, mas um StackTrace vale mais do que mil imagens!”