java多线程实现的三种方式
1.第一种方式:继承Thread类,重写run方法 :(这种方法不是很建议使用因为java只支持单继承)。
public class Time extends Thread { //重写run方法 public void run(){ } public static void main(String[] args) {、 //运行线程 不能直接调用run不然就是方法 new Time().start(); } }
2:第二种方式:实现实现Runable接口,重写run方法:
public class Time implements Runnable { @Override public void run() { System.out.println("12345"); } public static void main(String[] args) { var Time= new Time(); new Thread(Time,"定义线程的名字").start(); } }
3:第三种方式:实现Callable接口要实现call方法:
public class Time implements Callable { //重写call方法 @Override public Object call() throws Exception { System.out.println("我是实现多线程的第三种方式"); return null; } public static void main(String[] args) { Callable a=new Time(); //利用FutureTask用来包装一个 Callable 因为这个类实现了Runnable方法 FutureTask i=new FutureTask(a); Thread t=new Thread(i); t.start(); } }
最后总结:Thread和Runable都是重写了run方法;但java只支持但继承 所以继承Thread类就不能继承其他类了。
但Runable很好的解决了这个问题因为java中接口支持多继承。这两个都是没有返回值的。
Callable接口的实现是将call方法实现然后把Callable封装成FutureTask(这个类可以判断线程执行完毕还是取消执行)
这三种方式都是通过Thread的start()方法开启。
这三种方式都可以说本质上都是Runable实现因为
1:Thread实现了Runable;
2:Callable是通过封装成FuntureTask,FutureTask 可以用来包装一个 Callable 或是一个runnable对象。
因为FurtureTask实现了Runnable方法。
所以可以说本质是由Runable实现;