Как сделать чтобы программа не закрывалась java

Обновлено: 04.07.2024

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

2. Использование петли

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

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

Давайте рассмотрим краткий пример:

Здесь петля разорвется, если время превысит предел в 30 секунд. В приведенном выше решении есть несколько примечательных моментов:

  • Низкая точность: Цикл может работать дольше, чем установленный лимит времени . Это будет зависеть от времени, которое может занять каждая итерация. Например, если каждая итерация может занять до 7 секунд, то общее время может увеличиться до 35 секунд, что примерно на 17% больше, чем желаемый лимит времени в 30 секунд
  • Блокировка: Такая обработка в основном потоке может быть не очень хорошей идеей, так как она будет блокировать его в течение длительного времени . Вместо этого эти операции должны быть отделены от основного потока

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

3. Использование механизма прерывания

Здесь мы будем использовать отдельный поток для выполнения длительных операций. Основной поток будет посылать сигнал прерывания рабочему потоку по таймауту.

Если рабочий поток все еще жив, он поймает сигнал и остановит его выполнение. Если рабочий завершит работу до истечения тайм-аута, это никак не повлияет на рабочий поток.

Давайте взглянем на рабочий поток:

Здесь Thread.sleep имитирует длительную операцию. Вместо этого может быть любая другая операция. Важно проверить флаг прерывания, потому что не все операции прерываются . Поэтому в этих случаях мы должны вручную проверить флаг.

Кроме того, мы должны проверять этот флаг на каждой итерации, чтобы убедиться, что поток прекращает выполнение самого себя в течение задержки не более одной итерации.

Далее мы рассмотрим три различных механизма передачи сигнала прерывания.

3.1. Использование таймера

Кроме того, мы можем создать TimerTask для прерывания рабочего потока по таймауту:

Здесь мы определили a TimerTask , который принимает рабочий поток в момент его создания. Он прерывает рабочий поток при вызове его run метода . Timer вызовет TimerTask после указанной задержки:

Мы также можем использовать метод get a Future вместо использования a Таймер :

Здесь мы использовали ExecutorService для отправки рабочего потока, который возвращает экземпляр Future , чей метод get заблокирует основной поток до указанного времени. Это поднимет TimeoutException после указанного таймаута. В блоке catch мы прерываем рабочий поток, вызывая метод cancel для объекта F uture .

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

3.3. Использование Услуги Планового Исполнителя

Мы также можем использовать ScheduledExecutorService для прерывания задачи. Этот класс является расширением ExecutorService и предоставляет ту же функциональность с добавлением нескольких методов, которые имеют дело с планированием выполнения. Это может выполнить заданную задачу после определенной задержки в заданные единицы времени:

Приведенная выше программа планирует выполнение задачи через одну секунду с момента подачи. Эта задача отменит исходную длительную задачу.

4. Есть ли гарантия?

Нет никакой гарантии, что выполнение будет остановлено через определенное время . Основная причина заключается в том, что не все методы блокировки прерываемы. На самом деле существует лишь несколько четко определенных методов, которые можно прервать. Таким образом, если поток прерывается и установлен флаг, ничего больше не произойдет, пока он не достигнет одного из этих прерываемых методов .

Например, методы read и write прерываются только в том случае, если они вызываются в потоках, созданных с помощью InterruptibleChannel . BufferedReader не является InterruptibleChannel . Таким образом, если поток использует его для чтения файла, вызов interrupt() в этом потоке, заблокированном в методе read , не имеет никакого эффекта.

Однако мы можем явно проверять наличие флага прерывания после каждого чтения в цикле. Это даст разумную гарантию остановить поток с некоторой задержкой. Но это не гарантирует остановку потока после строгого времени, потому что мы не знаем, сколько времени может занять операция чтения.

С другой стороны, метод wait класса Object прерываем. Таким образом, поток, заблокированный в методе wait , немедленно выдаст исключение InterruptedException после установки флага прерывания.

Мы можем идентифицировать методы блокировки, ища throws | InterruptedException в их сигнатурах методов.

Один важный совет заключается в том, чтобы избегать использования устаревшего метода Thread.stop () . Остановка потока приводит к тому, что он разблокирует все мониторы, которые он заблокировал. Это происходит из-за исключения Thread Death , которое распространяется вверх по стеку.

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

5. Заключение

В этом уроке мы изучили различные методы остановки выполнения через определенное время, а также плюсы и минусы каждого из них. Полный исходный код можно найти на GitHub .

Какую команду можно поставить в конце командного файла, чтобы предотвратить автоматическое закрытие консоли после выполнения файла?

ОТВЕТЫ

Ответ 1

В пакетных файлах Windows/DOS:

Ответ 2

Зависит от точного вопроса!

Обычно pause выполняет задание в файле .bat.

Если вы хотите, чтобы cmd.exe не закрывался, чтобы продолжать печатать, используйте команду cmd /k в конце файла.

Ответ 3

Если вы хотите, чтобы cmd.exe не закрывался и мог продолжать печатать, используйте cmd /k

Просто почувствовал необходимость уточнить, что делает /k (с сайта Windows):

/k : Выполняет команду, указанную в строке, и продолжает.

Итак, cmd /k без последующей команды в конце файла bat просто сохранит окно cmd.exe для дальнейшего использования.

С другой стороны, pause в конце командного файла просто приостанавливает процесс и завершает cmd.exe при первой кнопке, нажав

Ответ 4

Ниже приведен список команд в командном файле, который откроет новые окна командной строки, а новые окна не будут автоматически выходить.

Ответ 5

Если вы используете Maven и хотите пропустить ввод и не допустить закрытия консоли, чтобы увидеть результат, вам нужно использовать команду CALL в скрипте, кроме просто "mvn clean install".

Как это закроет консоль

Так консоль будет оставаться открытой

Если вы не используете команду CALL , ни один из примеров вставки не будет работать.

Ответ 6

Добавьте cmd.exe в новую строку под кодом, который вы хотите выполнить:

Ответ 7

мой способ - написать фактическую партию (говоря "foo.bat" ), чтобы закончить работу; затем создайте еще один "start.bat":

Я считаю, что это очень полезно, когда я устанавливаю одноразовые переменные среды.

Ответ 8

Вызвать cmd в конце командного файла.

Ответ 9

. Он будет ожидать ввода пользователем и высвободит поток при нажатии клавиши.

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

Ответ 10

Возможность 1: Просто создайте 2 файла .bat и напишите в первую:

Пакетный файл 2 - это файл, который не закрывается в конце. Итак, теперь, когда вы открываете партию № 1, она начнет 2-й и сам гной. Когда второй заканчивается, он не будет полностью закрываться (до тех пор, пока вы не положите выход в конце)

Возможность 2: Пакетный файл 1:

Когда второй файл заканчивается, он снова переходит к файлу 1 и выводит оставшуюся часть. С этим вы даже можете сделать обработчики ошибок. Если nr.1 сбой, он переходит в nr.2 и отображает его

Ответ 11

Я знаю, что опаздываю, но мой любимый способ:

Таким образом, пользователь не может выйти, используя ввод.

Ответ 12

Этот маленький хак просит пользователя ввести ключ и сохраняет его в переменной% exitkey% (эта переменная может быть вызвана тем, что вам нравится, хотя).

NB: пространство после '=' очень важно

Ответ 13

Ответ 14

У меня были проблемы с ответами здесь, поэтому я придумал это, что работает для меня (TM):

Ответ 15

Есть два способа сделать это зависит от варианта использования

1) Если вы хотите, чтобы приглашение Windows cmd оставалось открытым, чтобы вы могли увидеть результат выполнения и закрыть его впоследствии; использовать

2), если вы хотите, чтобы приглашение Windows cmd оставалось открытым и позволяло выполнять некоторые последующие команды; использовать

введите описание изображения здесь

Ответ 16

Легко, добавьте cmd в свою последнюю строку летучей мыши, НО! если вы reset или очистите свой системный путь, вы должны запустить свой cmd с полным путем, например:

Например, у меня есть файл bat для reset jdk для старой версии, например:

Ответ 17

и окно закроется после нажатия клавиши. Чтобы скрыть текст, напечатанный в командной строке, введите

Кажется,я не могу понять, где и что вводить в while loop. Все работает нормально, но после того, как я ввожу преобразование, как я могу заставить его спросить меня, хочу ли я ввести еще одну проблему.

1 ответ

У меня есть задание, и оно имеет (среди прочих) два требования: сделайте установщик сделайте так, чтобы, если он установлен на одном компьютере, любой, кто пытается запустить те же файлы на другом компьютере, потерпит неудачу. Я использую vs9 (2008) express, я думаю, что могу сделать часть.

Ладно, значит, у меня проблема. Мой код печатает текст, давая возможность ввести любую из трех вещей. Если вы наберете один из них, он напишет строку. Но по какой-то причине он просто закрывается мгновенно (в visual studio я бы использовал Ctrl + f5) после печати текста, но из-за того, что я.

Что вы хотите повторить? Всю программу? Затем приложите "whole program" aka. основная логика с while loop, проверяющая, равен ли вход 4 или какой-либо другой произвольный выход int.

объявите "int choice" вверху, а затем через некоторое время вложите rest.

Редактировать (для ясности):

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

Я начал пытаться выучить C++ сегодня вечером и сейчас просто валяю дурака в IDE. Как сделать так, чтобы эта простая программа не закрывалась до тех пор, пока вы не угадаете правильное число (5, 6.

Я подаю заявление в python из Windows. Когда я запускаю его в консоли, он останавливается, показывает ошибку и закрывается. Я не вижу ошибки, потому что она слишком быстрая, и я не могу ее.

Я только начал работать с J2ME и музыкальными магазинами. Это, по-видимому, правильный способ открыть музыкальный магазин под названием foo, а не создавать новый: RecordStore.openRecordStore(foo.

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

Ладно, значит, у меня проблема. Мой код печатает текст, давая возможность ввести любую из трех вещей. Если вы наберете один из них, он напишет строку. Но по какой-то причине он просто закрывается.

Я хочу сделать программу C , которая случайным образом выбирает 6 чисел из числа диапазона 1 - 37 , не повторяя никаких ранее перестановок. Например, предположим, что программа случайным образом.

Я делаю программу, которая представляет собой вектор списков. Он отслеживает Слово и номер строки, на которой это слово было найдено. пример: teddy bears are cute so are you таким образом, он будет.

Я хочу, чтобы моя программа Java округлила числа до двух десятичных знаков. Я просматривал материалы своего класса и не мог найти решения. Вот код import java.io.*; import java.util.*; public class.

Я хочу, чтобы моя программа python 2.7 получала индекс конкретных символов в строке. Так вот как это: Получите индекс скобок [ и ] в любой строке. Например: Hello World [These brackets] Hello World.

Как правильно закрыть JFrame , так же, как если бы пользователь нажал кнопку закрытия X или нажал Alt + F4 (на винде)?

У меня есть операция закрытия по умолчанию, установленная так, как я хочу, через:

Это делает именно то, что я хочу с вышеупомянутыми элементами управления. Этот вопрос не об этом.

Что я действительно хочу сделать, так это заставить GUI вести себя так же, как нажатие кнопки закрытия X заставит его работать.

Предположим, я должен был расширить WindowAdaptor , а затем добавить экземпляр моего адаптера в качестве прослушивателя через addWindowListener() . Я хотел бы видеть ту же последовательность вызовов через windowDeactivated() , windowClosing() и windowClosed() , как это происходит с кнопкой закрытия X . Не столько разорвать окно, сколько сказать, что оно себя разрывает, так сказать.

Не слишком сложно.

Если под Alt-F4 или X вы подразумеваете "Немедленно выйти из приложения, независимо от того, что работают другие окна или потоки", то System.exit(. ) будет делать точно что Вы хотите очень резким, грубым и, возможно, проблемным способом.

Если под Alt-F4 или X вы подразумеваете скрытие окна, то frame.setVisible(false) - это то, как вы "закрываете" окно. Окно будет продолжать использовать ресурсы/память, но его можно будет снова быстро увидеть.

Если под Alt-F4 или X вы подразумеваете скрытие окна и избавление от любых ресурсов, которые оно потребляет, то frame.dispose() - это то, как вы "закрываете" окно. Если кадр был последним видимым окном и не запущены другие потоки, не являющиеся демонами, программа завершится. Если вы снова откроете окно, ему придется заново инициализировать все собственные ресурсы (графический буфер, дескрипторы окон и т.д.).

dispose() может быть ближе всего к поведению, которое вы действительно хотите. Если в вашем приложении открыто несколько окон, хотите ли вы, чтобы Alt-F4 или X закрыли приложение или просто закрыли активное окно?

Если вы сделали это, чтобы убедиться, что пользователь не может закрыть окно:

Читайте также: