gostaria de saber se eu posso compartilhar uma classe entre varios threads que tambem sao classes distintas, ou seja se eu alterar um propriedade dessa classe todos os threads vao enxergar essa alteracao…
Classe compartilhada em varios threads
8 Respostas
ueh
pela sua descricao faca esse seu atributo static e sincronize o acesso a ele…
abracos
tenho uma aplicacao cliente/servidor cada cliente quando se conecta ao servidor é tratado como um thread separado, este servidor tambem vai implementar outras classes como quem está conectado, a lista de usuarios online seria apenas uma instancia criada no servidor, essa instancia iria gerenciar os usuarios, nao teriam comunicacao direta com eles, se eu passase a referencia desta classe na construcao de cada cliente ela seria atualizada no primeiro cliente quando o segundo cliente se conectasse??
Há outra forma de se fazer isso…
Vc pode, por exemplo, passar um objeto da classe geral como parametro do construtor dos objetos thread.
// Exemplo
public class Geral { ... }
public class Main {
private Geral geral_obj = new Geral( ... );
private ObjThread th;
private Vector objetos;
public static void main(String args[]) {
for (int i=0;i<LIMITE;i++) {
th = new ObjThread(geral_obj, ... );
objetos.add(th);
}
}
}
Fazendo dessa forma cada objeto thread poderá ter acesso a classe geral,
e se for o caso criar acesso sincronizado para evitar erro de concorrencia.
A diferença desse metodo para o statico é que nesse vc precisa instanciar um objeto da classe Geral e no metodo estatico vc poderá usar as propriedades ou metodos sem a necessidade de criar um objeto para isso.[/code]
era isso mesmo que eu queria saber, é um tipo de Singleton que eu precisava… e um pouco de Observer
Se o que vc precisa tem caracteristicas de uma Singleton, vc não precisa passar uma referencia em cada contrução de Thread, basta vc ter os campos de dados como static e usar metodos acessores também static ( claro ) sendo que tais metodos sejam modificados com synchronized, desta forma todas as Threads irão acessar os mesmos dados.
Qualquer codigo de inicialização será posto em um bloco static no singleton, assim :
public class MySingleton{
private static Object field1;
private static Object field2;
private static Object fieldN;
static{
// codigo para inicializar os campos
// e qualquer outra tarefa de warm-up.
// lembre-se que este bloco só será chamado uma vez.
}
private MySingleton(){} // Singleton de verdade...
// implementação para os acessores...
}
É só fazer como este codigo que voce fez, ou existe algum objeto Singleton?
como ele fez. soh fica faltando o getter.
public static Object getObject() {
return object;
}
Se voce inicializou a referencia ja antes, nao precisa sincronizar o acesso. Se voce for fazer lazy initialization, faca.
valeu entao… obrigado…