2016-01-29 8 views
2

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

Main класс.

package com.ozankurt; 

public class Main { 

    public static void main(String[] args) { 

     Application application = new Application(); 

     application.start(); 

    } 
} 

класс Применения:

package com.ozankurt; 

import com.ozankurt.utilities.Input; 

public class Application implements Runnable { 

    private CommandHandler commandHandler; 

    private boolean running; 

    private volatile Thread thread; 
    private String threadName = "ApplicationThread"; 

    public Application() { 

     Handler handler = new Handler(this); 

     this.commandHandler = new CommandHandler(handler); 

     this.running = true; 
    } 

    public void start() { 

     if (thread != null) { 
      System.out.println(threadName + "is already running."); 

      if (!isRunning()) 
      { 
       System.out.println("Resuming " + threadName + "..."); 
       setRunning(true); 
      } 
     } else { 
      System.out.println("Starting " + threadName + "..."); 

      thread = new Thread(this, threadName); 
      thread.start(); 

      System.out.println("Started " + threadName + "."); 
     } 
    } 

    public void stop() { 
     System.out.println("Halting " + threadName + "..."); 

     setRunning(false); 

     System.out.println("Halted " + threadName + "."); 
    } 

    @Override 
    public void run() { 

     while (isRunning()) { 
      String userInput = Input.readLine(); 

      commandHandler.handle(userInput); 
     } 
    } 

    public boolean isRunning() { 

     return running; 
    } 

    public void setRunning(boolean running) { 

     this.running = running; 
    } 
} 

Я прочитал эту Java documentation о том, как остановить потоки в Java без использования stop метода, который стал устаревшими, поскольку он может бросить несколько исключений.

Насколько я понимаю, мы не должны пытаться остановить поток, и вместо этого мы должны определить свойство, соответствующее состоянию потока.

В моем случае я определил boolean running в моем Application классе и, как вы можете прочитать из моего кода в методе run я поясню проверить, если приложение running. Это означает, что я на самом деле никогда не останавливаю поток, я удаляю его только с помощью инструкции while. Правильно ли это объясняется в Java documentation?

+0

Кому нужно запустить/остановить эту тему? Почему они не могут убедиться, что они только запустили один из них? Что делает приложение? Где многопоточная часть (можете ли вы запустить более одного из них? Если да, то как они все читают с Input)? Без этого не ясно, что нужно сделать. – Thilo

+0

@Thilo Я только что обновил эту часть своего кода, можете ли вы снова проверить и посмотреть «название» моего редактирования из истории изменений. –

+0

«Приложение» в основном ждет ввода пользователем из командной строки и соответственно выполняет соответствующую команду. –

ответ

0

Пожалуйста, не ставьте метод запуска/остановки на Runnable, это просто возится с читателем! ЛОЛ! И не иметь этого runnable попытаться управлять своим собственным потоком, это еще более запутанно.

Во всяком случае, 1-й выпуск будет отсутствующим изменчивым на «запущенном» булевом.

Вторая проблема заключается в том, что ваш основной() заканчивается, когда вы начали поток. Это работает, конечно, но это показывает, что вам вообще не нужен ниток. Поток main() мог бы вызвать некоторые Application.loopOnCommands() или аналогичные.

3rd, stop() не прерывает нить. Я предполагаю, что readLine() может блокироваться, а метод handle (...) может быть длинным, поэтому сигнализация прерывания может пробуждать ожидающие потоки. Это не всегда приводит к отключению потока из кода, но может помочь, если этот код соблюдает возможность прерываний.

Смежные вопросы