@Override
    public void run() {
        try {
            synchronized (this) {
                while (true) {
                    while (ofertasRecursosLivres.isEmpty()) {
                        wait(tempoWaitVerificacoesLocais);
                    }
                    OfertaEmprego empregoLivre = buscarOfertaEmpregoLivre();
                    while (empregoLivre == null) {
                        wait(tempoWaitVerificacoesBD);
                        empregoLivre = buscarOfertaEmpregoLivre();
                    }
                    while (empregoLivre.getNumeroCandidatosNecessarios() > ofertasRecursosLivres.size()) {
                        wait(tempoWaitVerificacoesLocais);
                    }
                    try {
                        for (int i = 0; i < empregoLivre.getNumeroCandidatosNecessarios(); i++) {
                            serverUI.sendMessage("O recurso de ID "
                                    + ofertasRecursosLivres.peek() + " da área "
                                    + areaAtuacao.name()
                                    + " foi vinculada ao emprego de ID "
                                    + empregoLivre.getId() + ".");

                            conexao.getStatement().executeUpdate("update " + NOME_TABELA_OFERTAS_RECURSOS
                                    + " set " + RECURSOS_COLUNA_EMPREGO_ID + " = " + "'" + empregoLivre.getId() + "'"
                                    + " where " + RECURSOS_COLUNA_ID + " = " + "'" + ofertasRecursosLivres.poll() + "'");
                        }

                        serverUI.sendMessage("O emprego de ID " + empregoLivre.getId() + " foi dado como aprovado provisoriamente.");

                        conexao.getStatement().executeUpdate("update " + NOME_TABELA_OFERTAS_EMPREGO
                                + " set " + EMPREGO_COLUNA_ESTADO_OFERTA + " = " + "'" + Oferta.ESTADO_OFERTA.APROVACAO_PROVISORIA.name() + "'"
                                + " where " + EMPREGO_COLUNA_ID + " = " + "'" + empregoLivre.getId() + "'");

                        server.existemNovasOfertas();
                    } catch (SQLException ex) {
                        serverUI.sendMessage("Erro de SQL em ThreadGestaoArea.run()...");
                    } catch (RemoteException | OfertaEmpregoNotFoundException | NoPrivilegesException | OfertaRecursosNotFoundException | UserNotLoggedInException ex) {
                        serverUI.sendMessage("Foi dado como aprovado provisoriamente uma nova oferta de recursos mas a tentativa de notificar os clientes dos administradores falhou.");
                    } catch (IOException ex) {
                        serverUI.sendMessage("Erro com no sistema de ficheiros do servidor.");
                    }
                }
            }
        } catch (InterruptedException e) {
            serverUI.sendMessage("Erro no wait() em ThreadGestaoArea.run()...");
        }
    }