
区别:
- Thread 单继承受限;
- Runnable 无返回值;
- Callable 有返回值、可抛异常;
- 线程池可控、安全、高性能,是生产环境标准。
线程创建的方式
共有四种方式可以创建线程,分别是:继承Thread类、实现runnable接口、实现Callable接口、线程池创建线程
详细创建方式参考下面代码:
① 继承Thread类
步骤:
- 类继承 Thread
- 重写 run ()
- 创建对象,调用 start ()
优点: 简单
缺点: Java 单继承,无法再继承其他类,扩展性差。
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("MyThread…run…");
}
public static void main(String[] args) {
// 创建MyThread对象
MyThread t1 = new MyThread() ;
MyThread t2 = new MyThread() ;
// 调用start方法启动线程
t1.start();
t2.start();
}
}
② 实现runnable接口
步骤:
- 实现 Runnable
- 重写 run ()
- 传入 Thread 构造方法
优点: 接口多实现,不影响继承,灵活。
缺点:无返回值,无法抛异常。
public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("MyRunnable…run…");
}
public static void main(String[] args) {
// 创建MyRunnable对象
MyRunnable mr = new MyRunnable() ;
// 创建Thread对象
Thread t1 = new Thread(mr) ;
Thread t2 = new Thread(mr) ;
// 调用start方法启动线程
t1.start();
t2.start();
}
}
③ 实现Callable接口
特点:
- 重写call方法,有返回值
- 可以抛出异常
- 结合 FutureTask 使用
优点:有返回值、可抛异常。
缺点:稍复杂。
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("MyCallable…call…");
return "OK";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建MyCallable对象
MyCallable mc = new MyCallable() ;
// 创建F
FutureTask<String> ft = new FutureTask<String>(mc) ;
// 创建Thread对象
Thread t1 = new Thread(ft) ;
Thread t2 = new Thread(ft) ;
// 调用start方法启动线程
t1.start();
// 调用ft的get方法获取执行结果
String result = ft.get();
// 输出
System.out.println(result);
}
}
④ 线程池创建线程(一般项目里)
特点:
- 阿里开发规范:禁止使用 Executors,必须用 ThreadPoolExecutor!
- 同样实现 Runnable接口
优点:
- 控制线程数量
- 避免频繁创建销毁线程
- 提升性能、防止 OOM企业开发必须用线程池!
- 线程池可控、安全、高性能,是生产环境标准。
public class MyExecutors implements Runnable{
@Override
public void run() {
System.out.println("MyRunnable…run…");
}
public static void main(String[] args) {
// 创建线程池对象
ExecutorService threadPool = Executors.newFixedThreadPool(3);
threadPool.submit(new MyExecutors()) ; //提交任务
// 关闭线程池
threadPool.shutdown();
}
}
参考回答
在java中一共有四种常见的创建方式,分别是:继承Thread类、实现runnable接口、实现Callable接口、线程池创建线程。通常情况下,我们项目中都会采用线程池的方式创建线程。
runnable 和 callable 有什么区别
参考回答
线程的 run()和 start()有什么区别?
start(): 用来启动线程,通过该线程调用run方法执行run方法中所定义的逻辑代码,只能被调用一次。
run(): 封装了要被线程执行的代码,可以被调用多次。




