Обзор
Несмотря на то, что создание thread
действительно в Java, оно не рекомендуется по многим причинам. Наиболее важным является то, что создание thread
является довольно дорогостоящим и ресурсоемким. Кроме того, в стандартной библиотеке реализовано гораздо более безопасные / эффективные модели, которые можно использовать для упрощения проблемы. В этом конкретном сценарии я бы посоветовал против этой реализации из-за характера операции; повторный запуск * остановка . Обратите внимание, что thread
не может быть перезапущен после того, как он запущен , и единственный способ остановить поток во время выполнения - это вызвать interrupt()
. К сожалению, прерывание потока требует от разработчика реализации обработки ошибок в методе run()
. Ниже мы увидим метод run()
реализации Runnable
или Thread
.
public void run() {
try {
// Your connection logic would be here
yourLogic();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt(); // Maintain status
}
}
Предположим, вы создали собственную реализацию thread
под названием MyThreadImpl
. Ниже мы увидим, как его использовать:
public void starterMeth() {
Thread myThread = new MyThreadImpl(); // Create thread
myThread.start(); // Start execution in parallel
}
public void stopMeth() {
myThread.interrupt(); // Stop the thread
}
В качестве альтернативы, если вы реализуете свой собственный Runnable
, как вы в этом приложении, это будет выглядеть так:
public void starterMeth() {
Thread myThread = new Thread(new ServerRunnable()); // Create thread
myThread.start(); // Start execution in parallel
}
public void stopMeth() {
myThread.interrupt(); // Stop the thread
}
Хотя оба тезиса верны, существуют лучшие подходы.
Лучший подход
Я предлагаю использовать класс CompletableFuture из-за его надежной реализации и желаемого контроля. CompletableFutures использует глобальный ForkJoinPool.common()
для своей многопоточности, чтобы приложение могло выполняться с большей эффективностью. Кроме того, вы можете получить Future , который находится внутри объекта, для последующего использования, вместо того, чтобы пытаться заново создавать его каждый раз. Давайте рассмотрим, как эта реализация будет работать ниже:
public class Server {
CompletableFuture<Void> myFuture;
...
public void starterMeth() {
myFuture = new CompletableFuture<Void>(); // Create future
myFuture.runAsync(new ServerRunnable()); // Start execution in parallel
}
public void stopMeth() {
myFuture.cancel(true); // Stop the future
}
...
}