Класс Java Thread также является классом объекта, и его экземпляры унаследованы от java.lang.thread или его подкласса. Вы можете создать ветку на Java следующим образом. Выполнение потока может вызвать метод начала () потока:
Treat Thread = New Thread ();
Thread.Start ();
В приведенном выше примере мы не писали запущенный код для потока, поэтому поток заканчивается после вызова метода.
Существует два способа написать код, выполняемый при запуске потока: один из них должен создать экземпляр подкласса потока и переопределить метод запуска, а второе - реализовать интерфейс, выполняющий выполнение при создании класса. Далее мы подробно объясним эти два метода:
Создать подкласс потока
Создайте экземпляр подкласса потока и переопределите метод запуска. Метод выполнения будет выполнен после вызова метода start (). Пример вышеуказанного подкласса потока может быть создан и запускаться следующим образом:
открытый класс Mythread Extends Thread {public void run () {System.out.println ("Mythread running"); }} Mythread mythread = new mythread (); mytread.start ();Как только поток начнется, метод запуска вернется немедленно и не будет ждать, пока метод выполнения не будет выполнен до возвращения. Это как метод запуска выполняется на другом процессоре. Когда метод запуска будет выполнен, будет напечатана строка Mythread.
Вы также можете создать анонимный подкласс потока следующим образом:
Thread Think = new Thread () {public void run () {System.out.println ("Thread Running"); }}; thread.start ();Когда выполняется метод запуска нового потока, компьютер распечатывает строку «Поток запуска».
Реализация запускаемого интерфейса
Второй способ написать код выполнения потока - создать новый экземпляр класса, который реализует интерфейс java.lang.runnable, и методы в экземпляре могут быть вызваны потоком. Ниже приведен пример:
открытый класс MyRunnable Reflsements Runnable {public void run () {System.out.println ("Myrunnable Running"); }}Чтобы потоки выполняли метод run (), необходимо передать объект экземпляра Myrunnable в конструктор класса потока. Примеры следующие:
Thread Think = новый поток (new myrunnable ());
Thread.Start ();
Когда поток запускается, он вызовет метод запуска, который реализует запускаемый интерфейс. «Myrunnable Running» будет напечатан в приведенном выше примере.
Точно так же вы можете создать анонимный класс, который реализует запускаемый интерфейс, как показано ниже:
Runnable myrunnable = new Runnable () {public void run () {System.out.println ("Runnable Running"); }} Thread Thread = новый поток (myrunnable); thread.start ();Создать подкласс или реализовать запускаемый интерфейс?
Нет определенного ответа на какой из этих двух методов лучше, и они могут соответствовать требованиям. По моему личному мнению, я предпочитаю реализовать метод выполнения интерфейса. Поскольку пул потоков может эффективно управлять потоками, которые реализуют запускаемый интерфейс, если пул потоков заполнен, новые потоки будут стоять в очереди на выполнение до тех пор, пока пул потоков не станет холостым. И если поток реализован путем реализации подкласса потока, это будет немного сложнее.
Иногда нам нужно одновременно интегрировать два способа реализации запускаемого интерфейса и подкласса потока. Например, экземпляр, который реализует подкласс потока, может выполнять несколько потоков, которые реализуют runnable interface. Типичным применением является пул потоков.
Общая ошибка: вызов метода run () вместо метода start ()
Распространенная ошибка, сделанная путем создания и запуска потока, состоит в том, чтобы вызвать метод run () run () вместо метода start (), как показано ниже:
Thread newthread = new Thread (myrunnable ());
newthread.run (); // должно быть начало ();
Сначала вы не чувствуете ничего плохого, потому что метод run () действительно называется как вы хотите. Однако на самом деле метод run () не выполняется новым поток, который только что создал, а выполняется текущим потоком, который создал новый поток. То есть он выполняется потоком, который выполняет две вышеуказанные строки кода. Чтобы создать новый поток выполнить метод run (), необходимо вызвать метод запуска нового потока.
Название потока
При создании потока вы можете дать поток имя. Это помогает нам различать разные темы. Например: если в System.out записано несколько потоков, мы можем легко выяснить, какой поток выводит через имя потока. Примеры следующие:
Myrunnable runnable = new myrunnable (); Thread Think = new Thread (Runnable, "New Thread"); Thread.Start (); System.out.println (Thread.getName ());
Следует отметить, что, поскольку Myrunnable не является подклассом потока, у Myrunnable Class нет метода getName (). Вы можете получить ссылку на текущий поток следующими способами:
Thread.currentThread ();
String ThreadName = Thread.CurrentThread (). GetName ();
Пример кода потока:
Вот небольшой пример. Во -первых, выведите имя потока метода main (). Этот поток выделяется JVM. Затем откройте 10 потоков и назовите их 1 ~ 10. Каждый поток выходит после вывода собственного имени.
public Class ThreadExample {public static void main (string [] args) {System.out.println (thread.currentThread (). getName ()); for (int i = 0; i <10; i ++) {new Thread ("" + i) {public void run () {System.out.println ("Thread:" + getName () + "running"); } }.начинать(); }}}Следует отметить, что, хотя порядок начальных потоков упорядочен, порядок выполнения не упорядочен. То есть поток 1 не обязательно является первым потоком, который выводит свое имя на консоли. Это потому, что потоки выполняются параллельно, а не последовательно. JVM и операционная система определяют порядок выполнения потоков, и порядок его запуска не обязательно такой же, как у потоков.
Выше представляет собой сборник информации, созданной потоками Java. Мы будем продолжать добавлять соответствующую информацию в будущем. Спасибо за поддержку этого сайта!