Глубокое понимание Thread и Runnable в Java

Java

Отношения Thread и Runnable

Класс Thread — это класс реализации интерфейса Runnable.

public class Thread implements Runnable 

Анализ исходного кода

  • Нить Метод start() вызывается во время работы класса Threa.Исходный код выглядит следующим образом:

Когда вызывается метод start(), фактически запускается метод start0, и этот метод объявляется следующим образом:

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 может реализовать совместное использование ресурсов, поток не может завершить совместное использование ресурсов.