В чем разница между Thread start () и Runnable run () - PullRequest
204 голосов
/ 20 декабря 2011

Скажем, у нас есть эти два Runnables:

class R1 implements Runnable {
    public void run() { … }
    …
}

class R2 implements Runnable {
    public void run() { … }
    …
}

Тогда какая разница между этим:

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();

    r1.run();
    r2.run();
}

А это:

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();
    Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r2);

    t1.start();
    t2.start();
}

Ответы [ 14 ]

2 голосов
/ 11 марта 2016

Если вы вызываете метод run() напрямую, вы не используете многопоточность, поскольку метод run() выполняется как часть потока вызывающего.

Если вы вызовете метод start() в потоке, виртуальная машина Java вызовет метод run (), и два потока будут выполняться одновременно - текущий поток (main() в вашем примере) и другой поток (Runnable * 1007)* в вашем примере).

Посмотрите на исходный код метода start() в Класс потока

 /**
     * Causes this thread to begin execution; the Java Virtual Machine
     * calls the <code>run</code> method of this thread.
     * <p>
     * The result is that two threads are running concurrently: the
     * current thread (which returns from the call to the
     * <code>start</code> method) and the other thread (which executes its
     * <code>run</code> method).
     * <p>
     * It is never legal to start a thread more than once.
     * In particular, a thread may not be restarted once it has completed
     * execution.
     *
     * @exception  IllegalThreadStateException  if the thread was already
     *               started.
     * @see        #run()
     * @see        #stop()
     */
    public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        group.add(this);
        start0();
        if (stopBeforeStart) {
            stop0(throwableFromStop);
        }
    }

    private native void start0();

В приведенном выше коде вы не видитевызов метода run().

private native void start0() отвечает за вызов метода run().JVM выполняет этот собственный метод.

1 голос
/ 20 декабря 2011

В первом случае вы просто вызываете метод run() объектов r1 и r2.

Во втором случае вы фактически создаете 2 новых потока!

start() позвонит run() в какой-то момент!

0 голосов
/ 21 декабря 2017

Метод перезапуска вызова метода Start () расширенного класса Thread и интерфейса реализуемых Runnable.

Но, вызывая run (), он ищет метод run, но если класс реализует интерфейс Runnable, он вызывает метод переопределения run () класса Runnable.

пример:

`

public class Main1
{
A a=new A();
B b=new B();
a.run();//This call run() of Thread because run() of Thread only call when class 
        //implements with Runnable not when class extends Thread.
b.run();//This not run anything because no run method found in class B but it 
        //didn't show any error.

a.start();//this call run() of Thread
b.start();//this call run() of Thread
}

class A implements Runnable{
@Override
    public void run() {
            System.out.println("A ");
    }
}

class B extends Thread {

    @Override
    public void run() {
            System.out.println("B ");
    }
}

`

0 голосов
/ 18 мая 2015

Отдельные методы start () и run () в классе Thread предоставляют два способа создания многопоточных программ. Метод start () запускает выполнение нового потока и вызывает метод run (). Метод start () немедленно возвращается, и новый поток обычно продолжается до тех пор, пока метод run () не вернется.

Метод run () класса Thread ничего не делает, поэтому подклассы должны переопределить метод кодом, выполняемым во втором потоке. Если поток создается с аргументом Runnable, метод run () потока выполняет вместо этого метод run () объекта Runnable в новом потоке.

В зависимости от характера вашей многопоточной программы, непосредственный вызов метода Thread run () может дать тот же результат, что и вызов через метод start (), но в последнем случае код фактически выполняется в новом потоке.

...