В тази статия ще обсъдим подробно как да създадете нишка в Java.

Java Нишка е като виртуален процесор, който може да изпълни вашия Java код — във вашето Java приложение. когато се стартира Java приложение, неговият основен метод се изпълнява от главната нишка - специална нишка, която се създава от Java VM, за да стартира вашето приложение. От вътрешността на вашето приложение можете да създавате и стартирате повече нишки, които могат да изпълняват части от кода на вашето приложение паралелно с основната нишка.

Java нишките са обекти като всеки друг Java обект. Нишките са екземпляри на клас java.lang.Threadили екземпляри на подкласове на този клас. Освен че са обекти, java нишките могат също да изпълняват код.

Как да създадете Java нишка

Java ви позволява да създадете нишка по един от три начина:

  • Чрез внедряване на работещ интерфейс.
  • Чрез внедряване на Callable интерфейс.
  • Чрез удължаване на нишката.

Нека да разгледаме как тези начини помагат при внедряването на „нишката на Java“.

Работим интерфейс

Най-лесният начин да създадете нишка е да създадете клас, който имплементира интерфейса Runnable. Java обект, който имплементира Runnable интерфейса, може да бъде изпълнен от Java Thread.

Интерфейсът Runnable е стандартен интерфейс на Java, който идва с платформата Java. Интерфейсът Runnableима само един метод run(). Ето пример за внедряване на интерфейса Runnable:

Горният MyRunnable е просто задача, която искаме да изпълним в отделна нишка. Има различни начини, по които можем да го управляваме.

Изпълнение с нишка

Един от тях е да използвате класа Thread:

Стартирайте с ExecutorService

Също така можем да изпълним нашата задача с Executor Service (рамка, предоставена от JDK, която опростява изпълнението на задачи в асинхронен режим):

Тъй като сега внедряваме интерфейс, ние сме свободни да разширим друг базов клас, ако имаме нужда.

Бягай като Ламбда

Започвайки с Java 8, всеки интерфейс, който излага единичен абстрактен метод, се третира като функционален интерфейс, което го прави валидна цел за ламбда израз.

Можем да пренапишем горния Runnable код с помощта на ламбда израз:

Извикващ се интерфейс

Callable е подобрена версия на Runnable, която беше добавена в Java 1.5.

И двата интерфейса са проектирани да представят задача, която може да бъде изпълнена от множество нишки. Runnable задачите могат да се изпълняват с помощта на класа Thread или ExecutorService, докатоCallables могат да се изпълняват само с помощта на последния.

Интерфейсът Callable е общ интерфейс, съдържащ един метод call() — който връща обща стойност:

Методът call() се извиква, за да се изпълни асинхронната задача. Методът call()може да върне резултат. Ако задачата се изпълнява асинхронно, резултатът обикновено се разпространява обратно към създателя на задачата чрез Java Future. Такъв е случаят, когато Callable е изпратен до ExecutorService за едновременно изпълнение.

Можем да изпълним нашата задача с ExecutorService:

Доста често IO операции като четене от или запис на диск или мрежа са добри кандидати за задачи, които могат да се изпълняват едновременно. IO операциите често имат дълги времена на изчакване между четене и запис на блокове от данни. Като изпълнявате такива задачи в отделна нишка, избягвате ненужното блокиране на основната нишка на приложението.

Подклас на нишка

Другият начин е да създадете подклас на Thread и да замените метода run(). Методът run() е това, което се изпълнява от нишката, след като извикате start(). Ето пример за създаване на подклас Java Thread:

Също така имайте предвид, че MyThread не може да разшири друг клас, тъй като Java не поддържа множествено наследяване.

Стартирайте чрез старт

Има два начина за изпълнение на нишка. Един от тях е чрез извикване на метод start():

Извикването start() ще се върне веднага щом нишката бъде стартирана. Няма да изчака, докато методът run() приключи. Методът run() ще се изпълни, сякаш се изпълнява от различен процесор. Когато методът run()се изпълни, той ще отпечата предоставения текст.

Стартирайте с ExecutorService

Другият начин за стартиране на нишка е да използвате ExecutorService:

Callable срещу Runnable

Java Callable интерфейсът е подобен на Java Runnableинтерфейса, тъй като и двата представляват задача, която е предназначена да се изпълнява едновременно от отделна нишка.

Callable на Java е различен от Runnable по това, че методът run()на интерфейса Runnable не връща стойност и не може да хвърля проверени изключения (само RunTimeException).

Освен това, Runnable първоначално е проектиран за дълготрайно едновременно изпълнение, напр. стартиране на мрежов сървър едновременно или наблюдение на директория за нови файлове. Интерфейсът Callable е предназначен повече за еднократни задачи, които връщат един резултат.

Нишка или Runnable?

Няма правила за това кой от двата метода е най-добрият. И двата метода работят. Чрез внедряване на Runnable и предаване на екземпляр на изпълнението на екземпляр на Thread. Когато Runnable се изпълнява от пул от нишки, е лесно да поставите на опашка екземплярите на Runnable, докато нишка от пула не е активна. Това е малко по-трудно да се направи с подкласове Thread.

Заключение

В тази статия научихме различни начини за създаване на нишка в Java.

В следващата статия ще проверим Методите за нишка. Останете на линия.

Намирате ли тази статия за полезна? Последвайте ме (Дмитро Тимченко) в Medium и разгледайте другите ми статии по-долу! Моля, 👏 тази статия, за да я споделите!







ресурси:

Java Concurrency на практика: https://www.oreilly.com/library/view/java-concurrency-in/0321349601/

Runnable срещу разширяване на нишка: https://www.baeldung.com/java-runnable-vs-extending-thread

Java Callable: http://tutorials.jenkov.com/java-util-concurrent/java-callable.html