答:三种
1.定一个类继承Thread类创建线程
重写run()方法,run()方法中的代码就表示线程要完成的任务(也就是说run()方法就是执行体),实例化这个定义的类并执行start()方法来启动该线程。
2.定义一个类实现Runnable接口
重写run()方法,run()方法中的代码就表示线程要完成的任务(也就是说run()方法就是执行体),实例化定义类,并且把它传给实例化的Thread类,和线程名字(new Thread(myth,”新线程1").start(); myth为实例化的自定义类)并执行start()。
3.定义一个类实现Callable接口
并实现call()方法,call()方法中的代码就表示线程要完成的任务(也就是说call()方法就是执行体,并且带有返回值),实例化自定义对象,实例化FutureTask对象包装实例化的自定义对象(FutureTask<Integer> integerFutureTask = new FutureTask<>(myth);),并把他传给实例化的Thread类,和线程的名字(new Thread(integerFutureTask, “线程1”).start();)并执行start()。
注意:其中FutureTask实现了RunnableFuture接口,而RunnableFuture继承了Runnable,Future并分别提供了参数为callable、参数为Runnable的构造函数,所以可以把Runnable类型的线程写成callable,然后封装进一个由执行者调度并在必要时可以取消的FutureTask。