Java, пока цикл и потоки! [Дубликат]

мое решение:

static string GetPolyndrom(string str)
{
    string Longest = "";

    for (int i = 0; i < str.Length; i++)
    {
        if ((str.Length - 1 - i) < Longest.Length)
        {
            break;
        }
        for (int j = str.Length - 1; j > i; j--)
        {
            string str2 = str.Substring(i, j - i + 1);
            if (str2.Length > Longest.Length)
            {
                if (str2 == str2.Reverse())
                {
                    Longest = str2;
                }
            }
            else
            {
                break;
            }
        }

    }
    return Longest;
}
13
задан Epitaph 23 December 2008 в 22:26
поделиться

11 ответов

я задаюсь вопросом, является ли это хорошей практикой?

номер. Это не хорошо. Иногда, это - все, что Вы имеете, но это не хорошо.

И, каков мог быть более эффективный способ реализовать это?

, Как вещи входят в базу данных во-первых?

лучшее изменение состоит в том, чтобы исправить программы, которые вставляют/обновляют базу данных для выполнения запросов, которые переходят к базе данных и к программе. Тема JMS хороша для такого рода вещи.

следующее лучшее изменение состоит в том, чтобы добавить триггер к базе данных для постановки в очередь, каждый вставляет/обновляет событие в очередь. Очередь могла подать тему JMS (или очередь) для обработки Вашей программой.

план нейтрализации является Вашим циклом опроса.

Ваш цикл опроса, однако, не должен тривиально делать работы. Это должно бросить сообщение в очередь для некоторого другого процесса JDBC, чтобы продолжить работать. Запрос завершения является другим сообщением, которое может быть брошено в очередь JMS. Когда Ваша программа получает сообщение завершения, она абсолютно должна быть закончена с предшествующим запросом JDBC и может остановиться корректно.

Прежде, чем сделать любое из этого, посмотрите на решения ESB. Sun JCAPS или TIBCO уже имеет это. ESB с открытым исходным кодом как Mulesource или Jitterbit можно было уже создать эту функциональность уже и протестированный.

12
ответ дан Gray 24 December 2008 в 08:26
поделиться
  • 1
    @Paul J. Lucas: That' s, почему это говорит " был бы другой way" в предложении, где я упоминаю IMalloc. Извините, если это было неясно. Английский язык не является моим родным языком. I' ll перемещают его в отдельный абзац... – 0xC0000022L 25 February 2011 в 06:40

Это - действительно слишком большая проблема для ответа полностью в этом формате. Сделайте себе одолжение и пойдите, покупают Параллелизм Java на практике . Нет никакого лучшего ресурса для параллелизма на Java 5 + платформа там. Существуют целые главы посвящены этому предмету.

На предмет уничтожения Вашего процесса во время вызова JDBC, который должен быть прекрасным. Я полагаю, что существуют проблемы с прерыванием вызова JDBC (в котором Вы не можете?), но это - другой вопрос.

8
ответ дан cletus 24 December 2008 в 08:26
поделиться
  • 1
    Doesn' t то, которое String.hashCode() четко определено и стабильное, подразумевают, что порядок записей в хэш-таблице последователен? – Konrad Garus 31 May 2011 в 18:50

Поскольку другие сказали, то, что необходимо опросить, вероятно, показательно из более глубокой проблемы с дизайном системы..., но иногда это - путь, которым это идет, таким образом...

, Если требуется обработать "уничтожение" процесса немного более корректно, Вы могли бы установить рычаг завершения работы, который называют, когда Вы поражаете Ctrl + C :

volatile boolean stop = false;

Runtime.getRuntime().addShutdownHook(new Thread("shutdown thread") {

    public void run() {

        stop = true;
    }
});

затем периодически проверяют переменную остановки.

А более изящное решение состоит в том, чтобы ожидать на событии:

boolean stop = false;

final Object event = new Object();

Runtime.getRuntime().addShutdownHook(new Thread("shutdown thread") {

    public void run() {

        synchronized(event) {

            stop = true;
            event.notifyAll();
        }
    }
});

// ... and in your polling loop ...
synchronized(event) {

    while(!stop) {

        // ... do JDBC access ...
        try {

            // Wait 30 seconds, but break out as soon as the event is fired.
            event.wait(30000);
        }

        catch(InterruptedException e) {

            // Log a message and exit. Never ignore interrupted exception.
            break;
        }
    }
}

Или что-то как этот.

6
ответ дан Matsemann 24 December 2008 в 08:26
поделиться
  • 1
    +1 - неотсортированный: хорошая выгода. Имел эту проблему прежде и действительно вывел Свойства к " набор lines" (список), отсортировал их в алфавитном порядке и вывел набор в файл. – Andreas_D 31 May 2011 в 18:52

Обратите внимание, что Таймер (или подобный) был бы лучше в этом, Вы могли, по крайней мере, снова использовать его и позволить ему сделать со всеми деталями сна, планирования, обработки исключений, и т.д.

существует много причин, Ваше приложение могло умереть. Не фокусируйтесь на просто том.

, Если для Вашей работы JDBC даже теоретически возможно оставить вещи в полукорректном состоянии, затем у Вас есть ошибка, которую необходимо исправить. Вся Ваша работа DB должна быть в транзакции. Это должно пойти или не пойти.

3
ответ дан Dustin 24 December 2008 в 08:26
поделиться
  • 1
    @Konrad - тот же набор свойств (ключи) будет всегда печататься в том же порядке, но если Вы добавляете один ключ, файл свойств мог бы быть переставлен..., по крайней мере, there' s никакая гарантия, что другие ключи сохраняют свое упорядочивание – Andreas_D 31 May 2011 в 18:54

Это - Java. Переместите свою обработку во второй поток. Теперь Вы можете

  • Read от stdin в цикле. Если кто-то вводит "ВЫХОД", установите в то время как флаг ко лжи и выходу.
  • Создают AWT или кадр Swing с Кнопкой остановки.
  • Притворяются, что Вы - демон Unix и создаете сокет сервера. Ожидайте кого-то, чтобы открыть сокет и отправить "ВЫХОД". (Это имеет добавленную премию, что можно изменить сон на выбор с помощью тайм-аута.)

должны быть сотни вариантов на этом.

3
ответ дан jmucchiello 24 December 2008 в 08:26
поделиться

Относительно вопроса "Программа могла быть посреди вызова JDBC. Как я мог пойти о завершении его более корректно?" - видят , Как я могу прервать выполнение jdbc транзакция?

Примечание, что использование опроса со сном () редко является правильным решением - реализованный неправильно, это может закончиться hogging ресурсы ЦП (планировщик потока JVM заканчивает тем, что тратил беспорядочный сон количества времени и пробуждение поток).

1
ответ дан Community 24 December 2008 в 08:26
поделиться

Вы могли сделать поле составным значением, которое включает (концептуально) идентификатор процесса и метку времени. [Еще лучше используйте два или больше поля.] Запускают поток в процессе, который владеет доступом к полю, и имейте его цикл, спя и обновляя метку времени. Затем процесс опроса, который ожидает для владения доступом к полю, может заметить, что метка времени не обновила в некоторое время T (который намного больше, чем время интервала сна цикла обновления), и предположите, что ранее владеющий процесс умер.

, Но это все еще подвержено отказу.

На других языках, я всегда пытаюсь использовать скопление (), звонит для синхронизации на файле. Не уверенный, каков эквивалентный Java. Получите реальный параллелизм, если Вы вообще возможно можете.

0
ответ дан skiphoppy 24 December 2008 в 08:26
поделиться
  • 1
    Но в системе на 32 бита могут очень хорошо использоваться верхние биты адресов... – Henk Holterman 11 August 2010 в 05:20

Настройте обработчик сигналов для SIGTERM, который устанавливает флаг, говоря Вашему циклу выйти в его следующий раз через.

2
ответ дан chaos 24 December 2008 в 08:26
поделиться

Если это - Ваше приложение, и можно изменить его, Вы можете:

  • Заставляют его считать файл
  • Read для значения флага.
  • , Когда Вы хотите уничтожить его, Вы просто изменяете файл, и приложение выйдет корректно.

Не должен работать он это тяжелее это это.

0
ответ дан OscarRyz 24 December 2008 в 08:26
поделиться
  • 1
    Спасибо. Это didn' t происходят со мной для поиска " целое число hashing" потому что я застрял на значениях, являющихся указатели , но те страницы выглядят очень полезными. – zwol 10 August 2010 в 05:08

I‘ve создал Класс обслуживания в моей текущей company’s служебной библиотеке для этих видов проблем:

public class Service implements Runnable {

    private boolean shouldStop = false;

    public synchronized stop() {
        shouldStop = true;
        notify();
    }

    private synchronized shouldStop() {
        return shouldStop;
    }

    public void run() {
        setUp();
        while (!shouldStop()) {
            doStuff();
            sleep(60 * 1000);
        }
    }

    private synchronized sleep(long delay) {
        try {
            wait(delay);
        } catch (InterruptedException ie1) {
            /* ignore. */
        }
    }

}

, Конечно, это совсем не завершено, но необходимо получить суть. Это позволит Вам просто звонить stop() метод, когда Вы захотите, чтобы программа остановилась, и это выйдет чисто.

0
ответ дан Bombe 24 December 2008 в 08:26
поделиться
  • 1
    И когда Вы ищете " целое число hashing" на Вас указывают другая страница SO, которую этот эффективно копирует.:-) – Steven Sudit 10 August 2010 в 04:56

Я удивлен, что никто не упомянул механизм прерываний, реализованный в Java. Предполагается, что это решение проблемы остановки потока. У всех других решений есть по крайней мере один недостаток, поэтому этот механизм необходим для реализации в библиотеке параллелизма Java.

Вы можете остановить поток, отправив ему сообщение interrupt (), но есть другие способы прерывания потоков , Когда это происходит, создается InterruptedException. Вот почему вы должны обрабатывать это, например, при вызове sleep (). Вот где вы можете выполнить очистку и завершить корректно, как закрытие соединения с базой данных.

0
ответ дан 1 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: