Просто объясните методы start() и run() класса потока.

Java задняя часть .NET алгоритм

1. Первоначальное знакомство

поток Java завершенjava.lang.Threadкласс для реализации. Когда виртуальная машина запускается, существует поток, определенный основным методом. Новые потоки можно создавать, создавая экземпляр Thread. Каждый поток передается через метод, соответствующий определенному объекту Thread.run()Для завершения своей работы метод run() вызывается телом потока. Вызывая класс Threadstart()метод запуска потока.

В Java потоки обычно имеют пять состояний: созданный, готовый, работающий, заблокированный и мертвый.

первыйСоздать состояние. Когда создается объект потока, не вызывается метод запуска объекта, который является создаваемым потоком.

   Второесостояние готовности. Когда вызывается метод запуска объекта потока, поток переходит в состояние готовности, но планировщик потоков в это время не установил поток в качестве текущего потока, и в это время он находится в состоянии готовности. После того, как поток запущен, он также находится в состоянии готовности после выхода из ожидания или сна.

   ТретийРабочий статус. Планировщик потоков устанавливает поток в состоянии готовности в качестве текущего потока.В это время поток переходит в состояние выполнения и начинает выполнять код в функции запуска.

   Четвертыйсостояние блокировки. Когда поток выполняется, он приостанавливается, обычно для ожидания наступления определенного времени (например, готовности ресурса), прежде чем продолжить выполнение. Спящий режим, приостановка, ожидание и другие методы могут привести к блокировке потока.

   Пятыйсостояние смерти. Если метод запуска потока завершается или вызывается метод остановки, поток умирает. Для потока, который умер, метод запуска больше нельзя использовать для его подготовки.

Два, начать () метод

1. Зачем нужен метод start, какова его роль?

start() для запуска потока, который действительно реализует многопоточную работу.Роль метода запуска состоит в том, чтобы перевести поток из состояния NEW в состояние RUNABLE. Когда поток создан успешно, поток находится в НОВОМ (новом) состоянии.Если вы не вызываете метод start(), поток всегда находится в НОВОМ состоянии. После вызова start() поток становится RUNABLE и может выполняться.

2. Выполняется ли поток сразу после вызова метода start()?

Поток не выполняется немедленно; если быть точным, после вызова метода start() состояние потока — это состояние «ГОТОВ (готов)», а не состояние «РАБОТАЕТ (выполняется)» (подробности о состоянии Поток должен ждать планирования ЦП, разные JVM имеют разные алгоритмы планирования, неизвестно, когда запланированы потоки, поэтому порядок, в котором вызывается метод start(), не может определять порядок выполнения потоков.

Уведомление:Потому что жизненный цикл нити, нить по состоянию новый---->RUNABLE происходит только один раз, поэтому метод запуска потока () может быть вызван только один раз, много раз запускать поток является незаконным. В частности, когда поток завершил выполнение, его нельзя перезапустить.

3. Метод run()

1. Какой метод является методом запуска? Как метод запуска связан с методом запуска?

Метод run() вызывается как обычный методrun() на самом деле является распространенным методом, но когда поток вызывает метод start(), после того как поток запланирован ЦП и находится в рабочем состоянии, поток вызовет метод run();

2. Требует ли выполнение метода run(), чтобы поток вызывал метод start()?

Как упоминалось выше, метод run() является обычным методом объекта, поэтому его можно вызывать без вызова start() потока. Объекты потока могут вызывать метод запуска в любое время и в любом месте.

#Пример1:

  Thread t1 = new Thread(new MyTask(1));
  Thread t2 = new Thread(new MyTask(2));
     t1.run();
     t2.run();

Выход выше исправлен:

значение счетчика: 1 значение счетчика: 2

Посмотрите на другой пример:

 Thread t1 = new Thread(new MyTask());
 Thread t2 = new Thread(new MyTask());
     t1.start();
     t2.start();

Этот вывод не является фиксированным, поскольку выполнение потока непредсказуемо. Результат бега может быть другим.

Класс MyTask:

//实现Runnable接口
class MyTask implements Runnable{

    int count;
    public MyTask(int count) {
        this.count=count;
    }
    @Override
    public void run() {
        System.out.println("count的值:"+count);
    }
}

#Пример2:

1. Запустите поток методом start

    public class Main {  
      
        public static void main(String[] args) {  
            Thread t1 = new Thread(new T1());  
            Thread t2 = new Thread(new T2());  
            t1.start();  
            t2.start();  
        }  
      
    }  
      
    class T1 implements Runnable {  
        public void run() {  
            try {  
                for(int i=0;i<10;i++){  
                    System.out.println(i);  
                    Thread.sleep(100);  //模拟耗时任务  
                }  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
      
    class T2 implements Runnable {  
        public void run() {  
            try {  
                for(int i=0;i>-10;i--){  
                    System.out.println(i);  
                    Thread.sleep(100);  //模拟耗时任务  
                }  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
    }  

результат:

这里写图片描述
Указывает, что два потока выполняются одновременно.

2, сначала используйте метод запуска, чтобы запустить потокИзмените start() выше на run()

    public class Main {  
      
        public static void main(String[] args) {  
            Thread t1 = new Thread(new T1());  
            Thread t2 = new Thread(new T2());  
            t1.run();  
            t2.run();  
        }  
      
    }  

这里写图片描述
Описание Две темы фактически выполняют заказ.

Суммировать:

Через экземпляр 1 и сумму экземпляров мы можем узнать, что метод запуска используется для запуска потоков и может обеспечить параллелизм, в то время как метод запуска — это просто обычный метод, который не может обеспечить параллелизм, но будет вызываться во время параллельного выполнения.

Говоря об этом, я не знаю, понимают ли мои друзья разницу между этими двумя методами.Если у вас есть какие-либо вопросы, вы можете оставить сообщение для обмена.

В-четвертых, метод start() и анализ исходного кода метода run() (на основе JDK1.7.0_40)

    public synchronized void start() {  
        // 如果线程不是"就绪状态",则抛出异常!  
        if (threadStatus != 0)  
            throw new IllegalThreadStateException();  
        // 将线程添加到ThreadGroup中  
        group.add(this);  
        boolean started = false;  
        try {  
            // 通过start0()启动线程,新线程会调用run()方法  
            start0();  
            // 设置started标记=true  
            started = true;  
        } finally {  
            try {  
                if (!started) {  
                    group.threadStartFailed(this);  
                }  
            } catch (Throwable ignore) {  
            }  
        }  
    }  
public void run() {  
    if (target != null) {  
        target.run();  
    }  
} 

Пять, действительно разбирайтесь в классе Thread

Объект класса Thread на самом деле является объектом Java.Каждый класс просто объект потока соответствует нити. Класс объекта Thread предоставляется пользователю для работы потока, резьба приобретена. Настоящий пользователь низкоуровневого потока невидим. Следовательно, когда поток завершается и умирает, соответствующий объект Thread все еще может быть вызван, за исключением метода start() (мертвый поток не может быть запущен снова), например, run(), getName(), getPriority()** и Т. Д.

//简单起见,使用匿名内部类的方法来创建线程
    Thread thread = new Thread(){
        @Override
        public void run() {
            System.out.println("Thread对象的run方法被执行了");
        }
    };
    //线程启动
    thread.start();
    
    //用循环去监听线程thread是否还活着,只有当线程thread已经结束了,才跳出循环
    while(thread.isAlive()){}
    //线程thread结束了,但仍能调用thread对象的大部分方法
    System.out.println("线程"+thread.getName()+"的状态:"+thread.getState()+"---优先级:"+thread.getPriority());
    //调用run方法
    thread.run();
    //当线程结束时,start方法不能调用,下面的方法将会抛出异常
    thread.start();
использованная литература
  • http://www.cnblogs.com/jinggod/p/8485143.html
  • https://blog.csdn.net/u010568463/article/details/47911181
  • https://blog.csdn.net/xuxurui007/article/details/7685076

В статье есть что-то неуместное, пожалуйста, поправьте меня, вы также можете обратить внимание на мой паблик в WeChat:好好学java, доступ к высококачественным учебным ресурсам.