Существует два способа создания потоков в Java: с помощью класса Thread и с помощью интерфейса Runnable. При использовании интерфейса Runnable вам необходимо создать экземпляр Thread. Таким образом, независимо от того, создаете ли вы поток через класс Thread или интерфейс Runnable, вы должны создать экземпляр класса Thread или его подкласса. Конструктор класса Thread был перегружен восемь раз. Конструктор выглядит следующим образом:
Экземпляр класса, реализующего интерфейс 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();
}
}
Результаты запуска приведенного выше кода следующие:
Примечание. Любая программа Java должна иметь основной поток. Обычно имя этого основного потока — main. Только создав в программе другие потоки, его можно считать настоящей многопоточной программой. Другими словами, многопоточная программа должна иметь более одного потока.
Класс Thread имеет перегруженный конструктор, который может задать имя потока. Помимо использования метода конструктора для установки имени потока при создании потока, вы также можете использовать метод setName класса Thread для изменения имени потока. Чтобы задать имя потока через конструктор класса Thread, необходимо использовать общедоступный конструктор Thread (имя строки) класса Thread в подклассе 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 (имя строки) класса Thread, который имеет значение super (имя) в строке 018.
В основном методе создаются три потока: thread1, thread2 и thread3. Среди них thread1 устанавливает имя потока с помощью метода построения, thread2 изменяет имя потока с помощью метода setName, а thread3 не устанавливает имя потока.
Результаты бега следующие:
Примечание. Вы можете использовать setName для установки имени потока до и после вызова метода start. Однако использование setName для изменения имени потока после вызова метода start приведет к неопределенности, а это означает, что setName не может быть выполнен до тех пор, пока не будет запущен метод run. Если вы хотите использовать имя потока в методе запуска, произойдет такое явление, что, хотя метод setName вызывается, имя потока не изменяется.
Метод start класса Thread не может быть вызван несколько раз. Например, метод thread1.start() не может быть вызван дважды. В противном случае будет выдано исключение IllegalThreadStateException.