Pergunta

Meu cenário é o seguinte:

Estou implementando um servidor que deve limitar ou produzir uma resposta dentro do período de tempo limite especificado para cada solicitação. Assim, cada solicitação é garantida uma resposta do ponto de vista do servidor (a resposta, é claro, pode não chegar ao cliente devido à falha da camada de transporte, etc ...).

Para implementar a semântica acima, cada solicitação gera um thread (na verdade recupera um disponível de um pool de threads) e aguarda sua resposta por meio de uma notificação em um objeto de sincronização. O período de espera é limitado com um parâmetro de tempo limite enviado ao método de espera do objeto. O fio gerado delega a solicitação a um objeto que realmente sabe como lidar com a solicitação. A API de chamada deste objeto é conhecida, mas não existe um contrato de nível de serviço conhecido que especificaria que uma chamada nunca será pendurada indefinidamente. (Especificamente no meu caso, o servidor é na verdade um cliente CORBA - mas esse não é o ponto.)

Agora, o que me interessa, é se existe ou não uma maneira de eu detectar de alguma forma que esse tópico não é responsivo e depois matá -lo (interromper) mesmo que eu esteja bloqueado atualmente em uma chamada de método?

A propósito, eu sei que posso manter uma referência ao objeto Thread e, após uma quantidade pré-especificada, ligue para o método interromp (). Infelizmente, isso não garante a semântica "interrompa" ...

Java Thread Primitive Deprecation

Obrigado a todos

Foi útil?

Solução

Eu acho que se você não pode confiar na semântica de interrupção (), poderá estar sem sorte. Não existe uma maneira confiável ou segura de encerrar com força um segmento. É perigoso em qualquer idioma.

Eu espero que interromp () recebesse o que você precisa, mesmo que pudesse ser contornado. As chamadas do CORBA devem passar pelas classes de rede padrão e, portanto, devem interromper adequadamente qualquer chamada de bloqueio.

É o melhor que você pode fazer com pouco dos processos infantis completos.

Outras dicas

Tente usar um ExecutorService e faça com que a lógica de negócios real seja executada em um chamável. O futuro retornado pelo ExecorsService tem um pegue() Isso permite que você especifique quanto tempo você vai esperar ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top