列举创建线程的几种不同方法。
在Java中,主要有四种创建线程的方式:
- 继承Thread类:创建一个新的类作为Thread类的子类,然后重写Thread类的run()方法,将创建的线程要执行的代码放在run()方法中。然后创建子类的实例并调用其start()方法来启动线程。
class MyThread extends Thread {
public void run(){
// 代码
}
}
public class Main {
public static void main(String[] args) {
MyThread t = new MyThread();
t.start();
}
}
- 实现Runnable接口:创建一个新的类来实现Runnable接口,然后重写Runnable接口的run()方法。然后创建Runnable子类的实例,并以此实例作为Thread的参数来创建Thread对象,该Thread对象才是真正的线程对象。
class MyRunnable implements Runnable {
public void run(){
// 代码
}
}
public class Main {
public static void main(String[] args) {
MyRunnable r = new MyRunnable();
Thread t = new Thread(r);
t.start();
}
}
- 实现Callable和Future接口:与Runnable相比,Callable可以有返回值,返回值通过FutureTask进行封装。
class MyCallable implements Callable<Integer> {
public Integer call() {
// 代码,返回值为Integer
}
}
public class Main {
public static void main(String[] args) throws Exception {
MyCallable c = new MyCallable();
FutureTask<Integer> task = new FutureTask<>(c);
new Thread(task).start();
Integer result = task.get(); //获取线程返回值
}
}
- 使用线程池:Java 1.5开始,可以通过Executor框架在Java中创建线程池。
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
executor.execute(new Runnable() {
public void run() {
// 代码
}
});
}
executor.shutdown();
}
}
以上就是Java创建线程的四种方式,各有适用的场景和优点。