第一种方式:
创建:编写一个类 MyThread1 (这里只是小生的自定义命名,方便与代码里名称一致)让它继承 Thread 类,
并把需要多线程运行的程序放到 public void run() 方法里。
启动:在主函数中,new 出 MyThread1 类的实例。
运行:调用 MyThread1 类的实例的 start() 方法即可。
第二种方式:
创建:编写一个类 MyThread2 让它实现 Runnable 接口,并且要重写 run() 方法(把需要多线程运行的程序放到 public void run() 方法里)。
启动:在主函数中,new 出 MyThread1 类的实例,
new 出Thread 类(带有 target 的构造方法),
把MyThread1 类的实例作为参数传入Thread 类的构造方法里。
运行:调用 Thread 类的实例的 start() 方法即可。
第三种方式:
创建:实现 Callable 接口(小生定义这个类为 MyCallable),并且实现 call() 方法,注意 call() 方法是有返回值的。
启动:new 出Callable 接口的实现类MyCallable,
new 出 FutureTask 类的实例 task,
把call() 方法的返回值放入FutureTask 类的构造方法里,
把 task 放入 new 出的 Thread 构造方法里。
运行:调用 Thread 类的实例的 start() 方法即可。
三种方式的利弊总结:
第一种方式有继承的局限性,实现Runnable的方式适合处理有共享数据的问题
第一种方法好处:创建已经继承 Thread 类的类的实例,调用 start() 方法就能运行,代码写起来很方便,
当然缺点就是继承了Thread 父类,就没有办法继承其他的类了,扩展性不好。所以一般不建议用这种方式创建多线程。
第二种方法好处:继承接口,扩展性好。
弊端是相对的,第一种方式不好也是相对于第二种来说的,而第二种方式相比第三种方式来说,run() 方法没有返回值,并且不能申明抛出异常。
第三种方式好处上面已经说明,不好的就是编码很麻烦