Java多线程的创建方式有三种:继承Thread类,实现Runnable接口和使用Callable和Future接口。
一、继承Thread类
1 原理:
继承Thread类,重写run()方法,将需要并发执行的代码写在run()方法中,创建Thread类的对象,然后调用start()方法启动线程。
2 代码示例:
public class MyThread extends Thread {
public void run() {
System.out.println("Hello World!");
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
3 注意事项:
- 线程启动的方法是start()而不是run(),直接调用run()方法会在当前线程中执行而不是启动新线程。
- 同一线程对象只能启动一次,重复调用start()方法会抛出IllegalThreadStateException异常。
- 继承Thread类不便于代码复用,应该优先考虑实现Runnable接口。
二、实现Runnable接口
1 原理:
实现Runnable接口,实现run()方法,将需要并发执行的代码写在run()方法中,创建Thread类的对象,将实现了Runnable接口的对象传递给Thread类的构造方法,然后调用start()方法启动线程。
2 代码示例:
public class MyThread implements Runnable {
public void run() {
System.out.println("Hello World!");
}
public static void main(String[] args) {
MyThread thread = new MyThread();
Thread t = new Thread(thread);
t.start();
}
}
3 注意事项:
- 实现Runnable接口优于继承Thread类,因为Java是单继承的。
- 实现Runnable接口的类可以把任务提交给线程池,实现更好的线程管理。
三、使用Callable和Future接口
1 原理:
使用Callable接口表示需要并发执行的任务,Callable接口中的call()方法可以返回运算结果,使用Future接口来获取任务返回的结果。
2 代码示例:
public class MyCallable implements Callable<Integer> {
public Integer call() throws Exception {
return 1 + 1;
}
public static void main(String[] args) throws Exception {
MyCallable callable = new MyCallable();
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(callable);
System.out.println(future.get());
executor.shutdown();
}
}
3 注意事项:
- Callable和Runnable接口的区别在于,Callable接口的call()方法可以返回结果,而Runnable接口的run()方法不能返回结果。
- 使用Callable接口需要使用ExecutorService接口来提交任务,并通过Future接口获取任务返回的结果。
四 总结:
Java中创建多线程的方式有三种:继承Thread类、实现Runnable接口和使用Callable和Future接口。推荐使用实现Runnable接口的方式,因为Java是单继承的,如果继承Thread类则无法继承其他类;同时实现Runnable接口的类可以被提交到线程池中执行任务,实现更好的线程管理。在需要获取任务运算结果时,可以使用Callable和Future接口。