Erro na compilação "invalid method declaration; return type required"

Ao compilar um programa de criação de threads na linha 7 ocorreu o erro abaixo:

MoreThreads.java:7: error: invalid method declaration; return type required

MyThreads(String name) { …
^
1 error

Note que o erro é apontado pelo circunflexo logo na primeira letra da linha 7. Não entendi o que o Java quer dizer com método invalido. Estou enviando a tela de compilação e o código do programa. Agradeço se puderem dar uma olhada e indicar o tipo de erro. É um programa de um livro muito bom, não encontrei discrepância entre o digitado e o livro.

Atenciosamente,
Ronaldo

Listagem do código do programa:

// Cria várias threads.

class Mythread implements Runnable {
    Thread thrd;

    // Constrói uma nova thread.
    MyThread(String name) {
        thrd = new Thread(this, name);

        thrd.start(); // inicia a thread
    }

    public void run() {
        System.out.println(thrf.getName() + " starting.");
        try {
            for(int count = 0; count < 10; count++) {
                Thread.sleep(400);
                System.out.println("In " + thrd.getName() + ", count is " + count);
            }
        }
        catch(InterruptedException exc) {
            System.out.println(thrd.getName() + " interrupted.");
        }
        System.out.println(thrd.getName() + " terminating.");
    }
}

class MoreThreads {
    public static void main(String args[]) {
        System.out.Println("Main thread starting.");

        MyThread mt1 = new MyThread("Child #1");
        MyThread mt2 = new MyThread("Child #2");
        MyThread mt3 = new MyThread("Child #3");

        for(int i = 0; i < 50; i++) {
            System.out.print(".");
            try {
                Thread.sleep(100);
            }
            catch(InterruptedException exc) {
                System.out.println("Main thread interrupted.");
            }
        }

        System.out.println("Main thread ending.");
    }
}

Tela de comandos do Windows com a compilação:

1 curtida

Sua classe se chama Mythread, mas no construtor você digitou MyThread.

1 curtida

Sua classe chama MoreThreads e vc está declarando um construtor com o nome de MyThread. Se vc tenta declarar um construtor e o nome não é o mesmo da classe, seja porque vc errou alguma coisa na digitação, ou aproveitou o código de outro exemplo (que é o que parece), esse erro aparece, visto que o compilador acha que aquilo ali é um método que, obrigatoriamente, precisa de um tipo de retorno. No seu caso é só corrigir o nome do construtor :wink:

1 curtida

Obrigado pelas respostas. Alterei o programa e ele rodou, era só troca de letras maiúsculas por minúsculas. Gostaria que alguém me confirmasse se o que está acontecendo no programa está de acordo com o que entendi.

Primeiro minha explicação:

O código cria uma classe para thread chamada ‘MyThread’, seu construtor quando chamado em tempo de execução dentro da função ‘main’ cria a thread tipo ‘MyThread’ com o nome ‘name’ (parâmetro passado dentro de ‘main’), e ao mesmo tempo inicia essa thread com a linha ‘thrd.start();’, neste momento a função ‘run’, declarada na linha ‘public void run()’ começa a ser executada e dentro de um ‘try’ espera um tempo de 0,4 segundos e exibe quantas pausas foram feitas dentro da variável (de controle do ‘for’ em ‘run()’) ‘count’. Ao final de execução desta thread o programa exibe a mensagem informando o nome da thread e que ela terminou através da linha ‘System.out.println(thrd.getName() + " terminating.");’.

O código cria 3 theads dentro da função ‘main’ e ao mesmo tempo inicia a execução da função ‘run’ de cada thread criada.

Esse raciocíneo (de agora em diante) é meramente especulativo, mas o que notei de mais interessante no uso de várias threads ao mesmo tempo é que na linha ‘Thread.sleep(100)’, é feita uma pausa na thread que estiver no controle da execução naquele momento, como há 3 threads abertas esta linha faz a pausa, acessa, qualquer uma das 3 threads. Mas, eu pergunto, a pausa é nas 3 threads ao mesmo tempo, ou apenas em uma delas de cada vez?

Notei que o resultado da execução do programa não era idêntico ao resultado do livro. E não tirei nenhuma conclusão. Supus que por haver 3 threads abertas e em execução ao mesmo tempo isso gera resultados diferentes de acordo com o momento exato em que cada linha do programa está em execução. E executando o programa duas vezes notei que o resultado foi diferente, mesmo sendo o mesmo código, suponho que seja devido ao estado do processamento em nível de máquina, também. Isto é correto?

Obrigado pela atenção, até a próxima,
Ronaldo

Segue abaixo o código do programa e o resultado da execução na tela de comando do Windows.

// Cria várias threads.

class MyThread implements Runnable {
    Thread thrd;

    // Constrói uma nova thread.
    MyThread(String name) {
        thrd = new Thread(this, name);

        thrd.start(); // inicia a thread
    }

    public void run() {
        System.out.println(thrd.getName() + " starting.");
        try {
            for(int count = 0; count < 10; count++) {
                Thread.sleep(400);
                System.out.println("In " + thrd.getName() + ", count is " + count);
            }
        }
        catch(InterruptedException exc) {
            System.out.println(thrd.getName() + " interrupted.");
        }
        System.out.println(thrd.getName() + " terminating.");
    }
}

class MoreThreads {
    public static void main(String args[]) {
        System.out.println("Main thread starting.");

        MyThread mt1 = new MyThread("Child #1");
        MyThread mt2 = new MyThread("Child #2");
        MyThread mt3 = new MyThread("Child #3");

        for(int i = 0; i < 50; i++) {
            System.out.print(".");
            try {
                Thread.sleep(100);
            }
            catch(InterruptedException exc) {
                System.out.println("Main thread interrupted.");
            }
        }

        System.out.println("Main thread ending.");
    }
}

1 curtida

Sim Ronaldo, seu raciocínio está correto. Da forma que esse exemplo está implementado você não tem controle algum de qual thread estará em execução em um determinado momento. Seu exemplo ao ser executado terá quatro threads ativas no máximo, ou seja, a thread main e as três criadas. Thread.sleep faz com que a thread que está executando no momento fique inativa por ao menos a quantidade de milissegundos passados como parâmetro. Veja a documentação https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#sleep-long-

No seu caso, Thread.sleep pode atuar nas quatro threads. Por exemplo, mt1 pode estar ativa, entrar no sleep do run dela, ficar inativa e ao voltar ser parada pelo sleep do método main… Programação paralela é um assunto relativamente desafiador.

[]'s

2 curtidas