run()和start()调用问题简记

直接看个例子:
public class HelloSogou{
  public static synchronized void main(String[] a){
    Thread t=new Thread(){

      public void run(){

        Sogou();

      }

    };
  ①t.run();//②t.start()
  System.out.print("Hello");
  }
  static synchronized void Sogou(){
  System.out.print("Sogou");
  }
}
两处不一样的区别:
①处:调用run时只是单纯执行方法,故按代码顺序执行下来结果就是SogouHello。
②处:首先调用start()是开始了一个线程,那么现在程序中有了两个线程主线程main和线程t;这就涉及到:函数使用的锁是this(即对象本身),还是:若函数被static修饰则锁为类名.class。那么题目中两个函数都是使用了同一个锁即HelloSogou.class,当执行t.start()时,t线程准备调用Sogou方法,但是锁对象已被主线程占用,故要等待主线程执行完System.out.print("Hello")后释放锁才可以执行自己的Sogou方法。故此结果是HelloSogou

原文地址:https://www.cnblogs.com/yangrongkuan/p/12023843.html