区别

  • run()方法实际还是在主线程中执行,没有实现多线程的特性,因此它是同步执行的。
  • start()方法是主线程开了一个新的线程,它实现了多线程的特征,因此他是交替执行的。

举例说明

1) 线程.run()方法

public class MyThreadTask extends Thread {
    private int count = 5;
    @Override
    public void run() {
        while(count-- >0)
        {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程名" + this.getName() + ",次数(" + count + ")");
        }
    }
    public static void main(String[] args) {

        MyThreadTask task = new MyThreadTask();
        task.run();//顺序执行
	System.out.println("start 测试");

    }
}

测试一下

输出:

线程名Thread-0,次数(4)
线程名Thread-0,次数(3)
线程名Thread-0,次数(2)
线程名Thread-0,次数(1)
线程名Thread-0,次数(0)
start 测试

 通过结果我们可以看到使用run方法它是顺序执行的,先执行了线程MyThreadTask 类的对象task然后再执行主线程,因此它并没有实现多线程的特性。

2) 线程.start()方法

我们把run改成start()方法

public class MyThreadTask extends Thread {
    private int count = 5;
    @Override
    public void run() {
        while(count-- >0)
        {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程名" + this.getName() + ",次数(" + count + ")");
        }
    }
    public static void main(String[] args) {

        MyThreadTask task = new MyThreadTask();
        task.start();
	System.out.println("start 测试");

    }
}

测试一下

会看到不一样的结果
start 测试
线程名Thread-0,次数(4)
线程名Thread-0,次数(3)
线程名Thread-0,次数(2)
线程名Thread-0,次数(1)
线程名Thread-0,次数(0)

 通过结果我们可以看到使用start方法它不是顺序执行的,而是交错执行的,它实现了多线程的特征。