一、java中线程的创建方式
在Java中,创建线程主要有三种方式,即继承Thread类,实现Runnable接口,实现Callable接口,一个继承,两个实现。
1. 继承Thread类
写一个类MyThread,继承Thread类,覆写run()方法,创建Thread子类实例thread,通过thread调用start()启动线程。
public class MyThread extends Thread{
@Override // 实现Thread类,覆写run方法
public void run() {
System.out.println("继承Thread方式");
// ... 具体业务逻辑
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 启动线程
}
}
2. 实现Runnable接口
写一个类MyRunnable实现RUnnable接口,覆写run()方法,创建MyRunnable对象runnable,将runnable作为参数调用Thread有参构造,创建线程thread,调用start()启动线程。
public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("实现Runnable接口方式");
// ...具体业务逻辑
}
public static void main(String[] args) {
// 创建Runnable实现类对象
MyRunnable runnable = new MyRunnable();
// 将runnable作为参数,调用Thread有参构造得到线程
Thread thread = new Thread(runnable);
thread.start(); // 启动线程
}
}
3. 实现Callable接口
写一个类MyCallable实现Callable接口,覆写call方法(返回值为Callable泛型),然后创建实现类对象callable,再创建FutureTask对象,将callable作为参数传入,得到对象futureTask,再创建Thread对象,将futureTask作为参数传入,调用start方法启动线程。想要获得线程执行后的返回值,用futureTask调用get()方法,获取返回值。
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("实现Callable接口方式");
// ... 具体业务逻辑
return "返回值"; // 返回值,类型和Callable泛型一致,这里用String举例
}
public static void main(String[] args) {
// 创建Callable实现类对象
MyCallable callable = new MyCallable();
// 将callable作为参数创建FutureTask对象
FutureTask<String> futureTask = new FutureTask<>(callable);
// 将futureTask作为参数创建线程
Thread thread = new Thread(futureTask);
thread.start(); // 启动线程
try {
// 获取线程执行后的返回值
String result = futureTask.get();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、线程创建三种方式对比
- 继承和实现的区别,单继承多实现,实现扩展性更强。
- 三者创建线程的写法不同。
- 集成Thread和实现Runnable没有返回值,且覆写的run()方法。实现Callable方式,覆写的call()方法,有返回值,对应泛型。
注意:
调用start()才是启动线程,如果只是调用run()或者call()方法,都只是调用实例方法,并不是启动线程。
相关文章
暂无评论...