Существует два способа создания потоков в Java: с помощью класса Thread и с помощью интерфейса Runnable. При использовании интерфейса Runnable вам необходимо создать экземпляр Thread. Таким образом, независимо от того, создаете ли вы поток через класс Thread или интерфейс Runnable, вы должны создать экземпляр класса Thread или его подкласса. Конструктор класса Thread был перегружен восемь раз. Конструктор выглядит следующим образом:
Скопируйте код кода следующим образом:
публичная тема( );
публичный поток (работающая цель);
общедоступная тема (имя строки);
общественный поток (исполняемая цель, имя строки);
общественный поток (группа ThreadGroup, исполняемая цель);
общественный поток (группа ThreadGroup, имя строки);
public Thread (группа ThreadGroup, исполняемая цель, имя строки);
public Thread (группа ThreadGroup, Runnable target, имя строки, длинный stackSize);
Работоспособная цель
Экземпляр класса, реализующего интерфейс Runnable. Следует отметить, что класс Thread также реализует интерфейс Runnable, поэтому экземпляры классов, унаследованных от класса Thread, также могут передаваться в этот конструктор в качестве целей.
Строковое имя
Название потока. Это имя можно задать с помощью метода setName класса Thread после создания экземпляра Thread. Если имя потока не задано, поток использует имя потока по умолчанию: Thread-N — это порядок создания потока, который является неповторяющимся положительным целым числом.
Группа потоков
Группа потоков, к которой принадлежит текущий созданный поток. Если группа потоков не указана, все потоки добавляются в группу потоков по умолчанию. Подробности о группах потоков будут подробно обсуждаться в последующих главах.
длинный стекРазмер
Размер стека потоков. Обычно это значение кратно странице ЦП. Например, размер страницы x86 составляет 4 КБ. На платформе x86 размер стека потоков по умолчанию составляет 12 КБ.
Обычный класс Java может стать классом потока, если он наследуется от класса Thread. А код потока можно выполнить с помощью метода start класса Thread. Хотя подклассы класса Thread могут быть созданы напрямую, метод run класса Thread должен быть переопределен в подклассе, чтобы фактически запустить код потока. Следующий код представляет собой пример использования класса Thread для создания потока:
Скопируйте код кода следующим образом:
пакет мифрид;
публичный класс Thread1 расширяет Thread
{
публичный недействительный запуск()
{
System.out.println(this.getName());
}
public static void main(String[] args)
{
System.out.println(Thread.currentThread().getName());
Thread1 thread1 = новый Thread1();
Thread1 thread2 = новый Thread1 ();
поток1.start();
поток2.start();
}
}
Приведенный выше код создает два потока: поток1 и поток2. Строки с 005 по 005 в приведенном выше коде представляют собой метод запуска класса Thread1. Когда метод start вызывается в строках 014 и 015, система автоматически вызывает метод run. В строке 007 this.getName() используется для вывода имени текущего потока. Поскольку имя потока не указывается при создании потока, вывод имени потока представляет собой системное значение по умолчанию, которое имеет форму Thread. -н. Имя основного потока выводится в строке 011.
Результаты запуска приведенного выше кода следующие:
основной
Тема-0
Тема-1
Как видно из приведенного выше вывода, основной вывод в первой строке — это имя основного потока. Следующие потоки Thread-1 и Thread-2 являются выходными результатами потоков thread1 и thread2 соответственно.
Примечание. Любая программа Java должна иметь основной поток. Обычно имя этого основного потока — main. Только создав в программе дополнительные потоки, ее можно считать настоящей многопоточной программой. Другими словами, многопоточная программа должна иметь более одного потока.
Класс Thread имеет перегруженный конструктор для установки имени потока. Помимо использования метода конструктора для установки имени потока при создании потока, вы также можете использовать метод setName класса Thread для изменения имени потока. Чтобы задать имя потока через конструктор класса Thread, необходимо использовать общедоступный конструктор Thread(String name) класса Thread в подклассе Thread. Поэтому необходимо также добавить поток для передачи в конструктор имени потока. . Следующий код представляет собой пример установки имени потока:
Скопируйте код кода следующим образом:
пакет мифрид;
публичный класс Thread2 расширяет Thread
{
частная строка кто;
публичный недействительный запуск()
{
System.out.println(who + ":" + this.getName());
}
общественный Thread2 (Строка кто)
{
супер();
это.кто = кто;
}
public Thread2 (строка who, имя строки)
{
супер(имя);
это.кто = кто;
}
public static void main(String[] args)
{
Thread2 thread1 = новый Thread2 («thread1», «MyThread1»);
Thread2 thread2 = новый Thread2 («thread2»);
Thread2 thread3 = новый Thread2 («thread3»);
thread2.setName("MyThread2");
поток1.start();
поток2.start();
поток3.start();
}
В классе есть два конструктора:
Строка 011: public sample2_2 (строка who)
Этот конструктор имеет один параметр: who. Этот параметр используется для идентификации текущего созданного потока. Конструктор потока по умолчанию public Thread() по-прежнему вызывается в этом конструкторе.
Строка 016: public sample2_2 (строка who, имя строки)
Who в этом конструкторе имеет то же значение, что и who в первом конструкторе, а параметр name — это имя потока. В этом конструкторе вызывается общедоступный конструктор Thread(String name) класса Thread, который имеет значение super(name) в строке 018.
В основном методе создаются три потока: thread1, thread2 и thread3. Среди них поток1 задает имя потока с помощью метода построения, поток2 изменяет имя потока с помощью метода setName, а поток3 не устанавливает имя потока.
Результаты бега следующие:
Скопируйте код кода следующим образом:
поток1: MyThread1
поток2: MyThread2
поток3:Поток-1
Как видно из приведенного выше вывода, имена потоков thread1 и thread2 были изменены, тогда как имя потока thread3 по-прежнему имеет значение по умолчанию: Thread-1. Причина, по которой имя потока thread3 — не Thread-2, а Thread-1, заключается в том, что имя потока thread2 указано в строке 026. Поэтому при запуске потока thread3 имя потока thread3 устанавливается в Thread-1. Таким образом, вы получите вышеуказанный результат.
Примечание. Вы можете использовать setName для установки имени потока до и после вызова метода start. Однако использование setName для изменения имени потока после вызова метода start приведет к неопределенности, а это означает, что setName не может быть выполнен до тех пор, пока не будет запущен метод run. казнен. Если вы хотите использовать имя потока в методе запуска, может возникнуть ситуация, когда, хотя метод setName вызывается, имя потока не изменяется.
Метод start класса Thread не может быть вызван несколько раз. Например, метод thread1.start() не может быть вызван дважды. В противном случае будет выдано исключение IllegalThreadStateException.