Situação embaraçosa com Threads

Pessoal tenho o seguinte codigo:

package br.com.rad.radiocog;

import java.util.ArrayList;

public class Estudos2{
  public static void main(String[] args) throws InterruptedException{
    Ar ar1 = new Ar();
    DispositivosNormais d1,d2;
    RadioCognitivo r1;
    r1 = new RadioCognitivo(ar1, 0, 50);
    r1.transmitir(ar1);
    d1 = new DispositivosNormais(0, 5);
    d1.transmitir(ar1);
    d2 = new DispositivosNormais(5, 7);
    d2.transmitir(ar1);    
    //System.out.println(ar1.conFreq(20) + "  " + d2.getFreq() + "  " + r1.getFreq());

    System.exit(0);
  }
  
}

acontece que eu gostaria de rodar concorrentemente os seguintes trechos do codigo:

r1 = new RadioCognitivo(ar1, 0, 50);
    r1.transmitir(ar1);

em uma thread t1, e:

d1 = new DispositivosNormais(0, 5);
    d1.transmitir(ar1);

em outra thread t2, e:

d2 = new DispositivosNormais(5, 7); d2.transmitir(ar1);
em outra thread t3.

Minha pergunta é da pra fazer isso com thread? e se sim, como eu posso fazer isso? Já tentei usar threads mas não consigo passar o metodo transmitir(arg) de jeito nenhum. Até pensei em usar o método run() passando argumentos nele, mas parece que isso não é possível. Enfim alguém poderia me dar uma help?

obrigado

[code]package br.com.rad.radiocog;

import java.util.ArrayList;

public class Estudos2{
public static void main(String[] args) throws InterruptedException{
final Ar ar1 = new Ar();
final DispositivosNormais d1 = new DispositivosNormais(0, 5);
final DispositivosNormais d2 = new DispositivosNormais(5, 7);
final RadioCognitivor1 = new RadioCognitivo(ar1, 0, 50);
new Thread(new Runnable() {
@Override
public void run() {
r1.transmitir(ar1);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
d1.transmitir(ar1);
}
}).start();

new Thread(new Runnable() {
    @Override
    public void run() {
        d2.transmitir(ar1);    
    }
}).start();

}
}
[/code]

Muito grato ViniGodoy. Aparentemente as threads estão preparadas para rodar paralelamente.

mas agora eu estou com outro problema. O codigo ficou assim:

package br.com.rad.radiocog;

import java.util.ArrayList;

public class Estudos2{
  public static void main(String[] args) throws InterruptedException{
    final Ar ar1 = new Ar();
    final DispositivosNormais d1 = new DispositivosNormais(0, 5); 
    final DispositivosNormais d2 = new DispositivosNormais(5, 7);
    final RadioCognitivo r1 = new RadioCognitivo(ar1, 0, 50);
    
    new Thread(new Runnable()
    {
    	public void run()
    	{
    		try {
    			System.out.println("thread1");
				r1.transmitir(ar1);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	
    }).start();
    
    new Thread(new Runnable()
    {
    	public void run()
    	{
    		try {
    			System.out.println("thread2");
				d1.transmitir(ar1);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	
    }).start();
    
    new Thread(new Runnable()
    {
    	public void run()
    	{
    		try {
    			System.out.println("thread3");
				d2.transmitir(ar1);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	
    }).start();    

    System.exit(0);
  }
  
}

E quando eu mando executar, o resultado é os prints:

thread1
thread2

e não executa o thread3. Eu fiquei pensando que pode ser problemas de sincronização, já que o Objeto Ar ar1 é compartilhado entre as threads. Então eu distribui synchronized em todos os metodos que estou usando até agora. E imagina só! Nada, continua executando somente a 1 e 2 thread. Mas na verdade o que esta acontecendo é que o programa termina assim que printa thread1 e thread2. Então fico sem saber se a thread3 poderia ser executada ainda. Sinceramente não sei onde esta o problema… tens alguma idéia do que estou fazendo de errado?

obrigado

O código de threads é disparado em paralelo.
Portanto, assim que o método start() é executado, a nova thread começa a executar. Quem decide a ordem de execução (pois o paralelismo real é raro) é o sistema operacional.

Provavelmente seu código está atingindo o System.exit(0) antes que a thread3 tenha chance de executar pela primeira vez.

Esse comando mata o processo, eliminando todas as threads em execução.
Aliás, para que você colocou o System.exit ali?

Se você colocar um Thread.sleep(5000); antes do comando, para pausar a main thread por 5s, provavelmente verá as três threads executando.

Use o join() se quiser esperar uma thread parar de rodar.

[code]package br.com.rad.radiocog;

import java.util.ArrayList;

public class Estudos2{
public static void main(String[] args) throws InterruptedException{
final Ar ar1 = new Ar();
final DispositivosNormais d1 = new DispositivosNormais(0, 5);
final DispositivosNormais d2 = new DispositivosNormais(5, 7);
final RadioCognitivo r1 = new RadioCognitivo(ar1, 0, 50);

Thread thread1 = new Thread(new Runnable()
{
	public void run()
	{
		try {
			System.out.println("thread1");
			r1.transmitir(ar1);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
});

Thread thread2 = new Thread(new Runnable()
{
	public void run()
	{
		try {
			System.out.println("thread2");
			d1.transmitir(ar1);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
});

Thread thread3 = new Thread(new Runnable()
{
	public void run()
	{
		try {
			System.out.println("thread3");
			d2.transmitir(ar1);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
});    

//Dispara as tres threads juntas
thread1.start();
thread2.start();
thread3.start();
//Espera elas terminarem
thread1.join();
thread2.join();
thread3.join();

//Só depois roda o exit.
System.exit(0);

}
}[/code]