1.继承Thread类
public class MyThread extends Thread{
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println("锄禾日当午"+i);
}
}
}
public static void main(String[] args){
MyThread m=new MyThread();
m.start();
}
2.实现Runnable接口
public class MyRunable implements Runnable{
@Override
public void run() {
for (int i=0;i<10;i++){
System.out.println("一二三四五"+i);
}
}
}
public static void main(String[] args){
MyRunable myRunable=new MyRunable();
Thread t=new Thread(myRunable);
t.start();
}
3.实现Callable接口
package fangfa1;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* @Description: TODO(这里用一句话描述这个类的作用)
* @Author admin
* @Date 2022/2/13 13:43
*/
public class Demo5 {
public static void main(String[] args) {
Call call = new Call();
FutureTask<Integer> futureTask=new FutureTask<>(call);
new Thread(futureTask).start();
for(int i=0;i<100;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
}
static class Call implements Callable<Integer> {
@Override
public Integer call() throws Exception {
for(int i=0;i<100;i++){
Thread.sleep(1000);
System.out.println(i);
}
return 100;
}
}
}
注意:面试时会问到第三种创建方式(但是平常极少用)
Runnable与Callable的相同点
(1)都是接口
(2)都可以编写多线程程序
(3)都采用Thread.start()启动线程
Runnable与Callable的不同点
(1)Ruunnable没有返回值,Callable可以返回执行结果(需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞)
(2)Callbale中的call()允许抛出异常,Runnable中的run()不允许










