方式一:继承Thread类,覆写run方法,创建实例对象,调用该对象的start方法启动线程。
方式二:创建Runnable接口的实现类,类中覆写run方法,再将实例作为此参数传递给Thread类有参构 造创建线程对象,调用start方法启动。
方式三:创建Callable接口的实现类,类中覆写call方法,创建实例对象,将其作为参数传递给
FutureTask类有参构造创建FutureTask对象,再将FutureTask对象传递给Thread类的有参构造创建线程对象,调用start方法启动。
区别:
方式一有单继承的局限性。
方式二和方式三避免了单继承的局限,使用更广泛。而方式二适用于无需返回值的场景,方式三使用于 有返回值的场景。