JAVA线程的创建-面试题引发的思考
2023-09-17 17:56:46
面向对象程序设计的开端,是一场对源代码重用的探索。用工程化的方式组织开发,使开发者们开始形成协作的意识。多线程机制的加入,则如同一枚重磅炸弹,在程序开发的世界里炸开了花。
想学好JAVA多线程,先答一道面试题吧:创建线程,有哪几种方式?
这个问题,不知难倒了多少JAVA程序员。但答案其实很简单,无非三种:
- 继承Thread类,重写run方法。
- 实现Runnable接口,重写run方法。
- 使用Callable和Future。
接下来,我们来详细分析一下这三种创建线程的方法。
1. 继承Thread类,重写run方法
这是最简单的一种创建线程的方法。只要继承Thread类,重写run方法,然后调用start()方法即可。代码如下:
public class MyThread extends Thread {
@Override
public void run() {
// 线程体
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
这种方法简单易用,但灵活性较差。因为线程类是单继承的,如果需要同时继承其他类,就无法使用这种方法创建线程。
2. 实现Runnable接口,重写run方法
这种方法比第一种方法灵活,它允许线程类同时继承其他类。只要实现Runnable接口,重写run方法,然后将Runnable接口的对象传递给Thread类的构造函数,并调用start()方法即可。代码如下:
public class MyThread implements Runnable {
@Override
public void run() {
// 线程体
}
public static void main(String[] args) {
MyThread thread = new MyThread();
Thread t = new Thread(thread);
t.start();
}
}
这种方法的灵活性较强,但代码也比第一种方法复杂一些。
3. 使用Callable和Future
这种方法是Java5之后引入的,它允许线程返回一个结果。只要实现Callable接口,重写call()方法,然后将Callable接口的对象传递给FutureTask类的构造函数,并调用FutureTask类的run()方法即可。代码如下:
public class MyThread implements Callable<Integer> {
@Override
public Integer call() {
// 线程体
return 1;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyThread thread = new MyThread();
FutureTask<Integer> task = new FutureTask<>(thread);
Thread t = new Thread(task);
t.start();
Integer result = task.get();
System.out.println(result);
}
}
这种方法的灵活性最强,但代码也最复杂。
以上三种创建线程的方法,各有优缺点。在实际开发中,应根据具体情况选择合适的方法。
多线程机制的引入,让JAVA语言如虎添翼,在程序开发的世界里叱咤风云。但想要驾驭好多线程机制,还需要开发者们不断地学习和实践。只有这样,才能在纷繁复杂的代码世界里,游刃有余。