Отношения Thread и Runnable
Класс Thread — это класс реализации интерфейса Runnable.
public class Thread implements Runnable
Анализ исходного кода
- Нить Метод start() вызывается во время работы класса Threa.Исходный код выглядит следующим образом:
private native void start0()
native указывает, что этот метод является собственной функцией, то есть эта функция реализована на C/C++, скомпилирована в DLL и вызывается Java. Собственный метод регистрируется при инициализации объекта Thread.Как показано на рисунке, в статическом блоке static есть метод registerNatives, который регистрирует некоторые локальные методы для использования классом Thread.
Метод start0 создаст новый поток в JVM.
- Запускаемый Интерфейс Runnable имеет только один метод run(), который полностью соответствует спецификации запуска потока.
Анализ примера кода
- Класс Thread определяет класс, который продает билеты
public class TicketThread extends Thread {
private int ticket = 100000;
@Override
public void run() {
for (int i = 0; i < 100000; i++) {
if (ticket > 0) {
System.out.println("ticket=" + ticket-- + "," + Thread.currentThread().getName());
}
}
}
}
начать три потока
new TicketThread().start();
new TicketThread().start();
new TicketThread().start();
В текущей разработке каждый поток самостоятельно выполняет задачу по продаже билетов, и количество голосов в каждом потоке поочередно уменьшается на 1.
- Интерфейс Runnable реализует класс, который продает билеты
public class TicketRunnableThread implements Runnable {
private int ticket = 1000;
public void run() {
for (int i = 0; i < 1000; i++) {
if (ticket > 0) {
System.out.println("ticket=" + ticket-- + "," + Thread.currentThread().getName());
}
}
}
}
начать три потока
TicketRunnableThread ticketRunnableThread = new TicketRunnableThread();
new Thread(ticketRunnableThread).start();
new Thread(ticketRunnableThread).start();
new Thread(ticketRunnableThread).start();
Три потока совместно выполняют задачу по продаже билетов, но три потока совместно выполняют один и тот же фрагмент кода, что приведет к небезопасности потока, которую можно решить с помощью блокировки.
использовать выделение
- При реализации интерфейса Runnable другие классы также могут наследоваться, чтобы избежать ограничений одиночного наследования Java.
- Интерфейс Runnable может реализовать совместное использование ресурсов, поток не может завершить совместное использование ресурсов.