java创建线程的三种方式
继承Thread类
//继承Thread类,然后重写run()方法,调用start开启线程
public class TestThread1 extends Thread{
@Override
public void run() {
System.out.println("线程运行了");
}
public static void main(String[] args) {
TestThread1 thread1 = new TestThread1();
thread1.start();
}
}
实现Runnable接口
//实现Runnable接口,然后重写run()方法,在创建Thread对象时作为参数传递,然后调用start方法开启线程
public class TestThread implements Runnable {
@Override
public void run() {
System.out.println("线程运行了");
}
public static void main(String[] args) {
Thread thread = new Thread(new TestThread());
thread.start();
}
}
实现Callable接口
//实现步骤如下
public class TestThread implements Callable {
//线程的返回值类型自定义
@Override
public String call() throws Exception {
return "线程运行完成";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建执行服务
ExecutorService executorService = Executors.newFixedThreadPool(1);
//提交执行线程
Future<String> submit = executorService.submit(new TestThread());
//获取执行返回值结果
String s = submit.get();
System.out.println(s);
//关闭服务
executorService.shutdownNow();
}
}
三种实现方式的区别
二.创建线程的三种方式的对比
1.实现Runnable或Callable接口比继承Thread类的优势
(1) Runnable或Callable接口适合多个线程进行资源共享
(2)java中单一继承,但是多接口实现,提高扩展性
(3) 增加程序的健壮性,代码和数据独立
(4) 线程池只能放入Runable或Callable接口实现类,不能直接放入继承Thread的类
2.Callable和Runnable之间的区别
(1) Callable重写的是call()方法,Runnable重写的方法是run()方法
(2) call()方法执行后可以有返回值,run()方法没有返回值
(3) call()方法可以抛出异常,run()方法不可以