Як перервати виконання методу?
І тут перед викликом методу bar йде перевірка на негативне число n .
Як на мене оператор return у void методах у 80% випадку можна замінити на якусь логіку, наприклад, метод вище можна переписати ось так
public void foo(int n) < if(n >= 0) bar(n);
Якщо метод щось повертає, то оператор return використовується завжди (оскільки він повертає) а іноді й більше одного разу (у методах з логікою, що розгалужується)
public String foo(int n)
@Regent в коментарях мене поправив. Якщо оператор return поверне значення і закінчить виконання методу, то драбинка if/else не потрібна.
як призупинити виконання програми в Java [закритий]
Закритий.Це питання необхідно уточнити або доповнити подробицями.
Бажаєте покращити це питання? Додайте більше подробиць та уточніть проблему, відредагувавши це повідомлення.
Дивлячись якусь програму. Дивлячись як треба призупинити.
1 відповідь 1
Призупинити програму можна у різний спосіб.
А поганий він тим, що від машини до машини (на яку виконується програма) час зупинки буде різним.
Thread.sleep(1000); //час зупинки в мілісекундах
Вже набагато краще - тут Ви і контролюєте час зупинки, незалежно від коду машини, що виконує, і не змушуєте процесор працювати в порожню.
Thread - клас для роботи з потоками, двома словами - будь-яка програма написана на Java має як мінімум один потік, тому виконання Thread.sleep() спрацює скрізь!
Як зупинити виконання Java?
Приклади потоків раніше представляли потік як послідовний набір операцій. Після виконання останньої операції завершувався потік.Наприклад, потік сервера в нескінченному циклі прослуховує певний порт щодо отримання даних. І в цьому випадку ми також можемо передбачити механізм завершення потоку.
Завершення потоку
Поширений спосіб завершення потоку представляє опитування логічної змінної.
Визначимо наступний клас потоку:
class MyThread implements Runnable < private boolean isActive; void disable()< isActive=false; >MyThread() < isActive = true; .currentThread().getName()); int counter=1; while(isActive)< System.out.println("Loop " + counter++); try< Thread.sleep(400); System.out.printf("%s finished. \n", Thread.currentThread().getName());
Змінна isActive вказує на активність потоку. За допомогою методу disable() ми можемо скинути стан цієї змінної.
Тепер використовуємо цей клас:
public static void main(String[] args) < System.out.println("Main thread started. "); .sleep(1100); Thread.sleep(1000); >catch(InterruptedException e) < System.out.println("Thread has been interrupted");
Отже, спочатку запускається дочірній потік: new Thread(myThread,"MyThread").start() .
Метод interrupt
Ще один спосіб виклику завершення або переривання потоку представляє метод interrupt() .
При цьому сам виклик цього методу не завершує потік, він лише встановлює статус: зокрема, метод isInterrupted() класу Thread повертатиме значення true. Ми можемо перевірити значення, що повертається даним методом і зробити деякі дії. Наприклад:
class JThread extends Thread < JThread (String name) < super (name); >public void run() < System.out.printf("%s started. \n", Thread.currentThread().getName()); int counter = 1; // лічильник циклів while(!isInterrupted())< System.out.println("Loop" + counter++); >System.out.printf("%s finished. \n", Thread.currentThread().getName()); > > public class Program < public static void main(String[] args) < System.out.println("Main thread started. "); JThread t = New JThread("JThread"); t.start(); try< Thread.sleep(150); t.interrupt(); Thread.sleep(150); >catch(InterruptedException e) < System.out.println("Thread has been interrupted"); >System.out.println("Main thread finished. "); > >
У класі, успадкованому від Thread, ми можемо отримати статус поточного потоку за допомогою методу isInterrupted() . І доки цей метод повертає false, ми можемо виконувати цикл. А після того, як буде викликаний метод interrupt, isInterrupted() поверне true, і відповідно відбудеться вихід із циклу.
Можливий консольний висновок:
Main thread started. JThread started. Loop 1 Loop 2 Loop 3 Loop 4 JThread finished. Main thread finished.
Якщо основна функціональність укладена в класі, який реалізує інтерфейс Runnable, там можна перевіряти статус потоку за допомогою методу Thread.currentThread().isInterrupted() :
class MyThread implements Runnable < public void run()< System.out.printf("%s started. \n", Thread.currentThread().getName()); int counter = 1; // лічильник циклів while(!Thread.currentThread().isInterrupted())< System.out.println("Loop" + counter++); >System.out.printf("%s finished."\n", Thread.currentThread().getName()); > > public class Program < public static void main(String[] args) < System.out.println("Main thread started. "); MyThread(); Thread t = new Thread(myThread,"MyThread"); try< Thread.sleep(150); t.interrupt(); "Main thread finished. ");
Однак при отриманні статусу потоку за допомогою методу isInterrupted() слід враховувати, що якщо ми обробляємо в циклі виключення InterruptedException у блоці catch, то при перехопленні виключення статус потоку автоматично скидається, і після цього isInterrupted буде повертати false.
Наприклад, додамо в цикл потоку затримку за допомогою методу sleep:
public void run() < System.out.printf("%s started. \n", Thread.currentThread().getName()); int counter = 1; // лічильник циклів while(!isInterrupted())< System.out.println("Loop" + counter++); try< Thread.sleep(100); >catch(InterruptedException e) < System.out.println(getName() + "has been interrupted"); System.out.println(isInterrupted()); // false interrupt(); // повторно скидаємо стан >> System.out.printf("%s finished. \n", Thread.currentThread().getName()); >
Коли потік викликає метод interrupt, метод sleep згенерує виняток InterruptedException, і управління перейде до блоку catch. Але якщо ми перевіримо статус потоку, то побачимо, що методінтерrupted повертає false. Як варіант, у разі ми можемо повторно перервати поточний потік, знову ж таки викликавши метод interrupt(). Тоді при новій ітерації циклу при методі, якийрозіграється, поверне true, і буде вихід з циклу.
Або ми можемо відразу ж у блоці catch вийти з циклу за допомогою break:
while(!isInterrupted()) < System.out.println("Loop" + counter++); try< Thread.sleep(100); >catch(InterruptedException e) < System.out.println(getName() + "has been interrupted"); break; // Вихід із циклу >>
Якщо безкінечний цикл поміщений у конструкцію try. catch, то достатньо обробити InterruptedException:
public void run() < System.out.printf("%s started. \n", Thread.currentThread().getName()); int counter = 1; // лічильник циклів try< while(!isInterrupted())< System.out.println("Loop" + counter++); Thread.sleep(100); >> catch(InterruptedException e) < System.out.println(getName() + "has been interrupted"); >System.out.printf("%s finished. \n", Thread.currentThread().getName()); >