继承 Thread 类
public class MyThread extends Thread {
public void run() {
System.out.println("MyThread.run()");
}
public static void main(String[] args){
MyThread myThread1 = new MyThread(); // 创建线程
myThread1.start(); // 启动线程
}
}
实现 Runnable 接口
如果自己的类已经 extends 另一个类,就无法直接 extends Thread,此时,可以实现一个 Runnable 接口
public class MyRunnable extends OtherClass implements Runnable {
public void run() {
System.out.println("MyThread.run()");
}
public static void main(String[] args){
Thread thread = new Thread(new MyRunnable());
thread.start();
}
}
实现 Callable 接口
若想线程执行完后有返回值,则可以实现 Callable 接口,搭配 FutureTask 或线程池来获取返回值
- 通过 FutureTask 获取返回值
public class MyCallable implements Callable<String>{
public String call() throws Exception{
return "This is return value";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> task = new FutureTask<>(new MyCallable());
new Thread(task).start();
// 获取返回值
String val = task.get();
System.out.println(val);
}
}
- 使用线程池
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService pool = Executors.newFixedThreadPool(5);
Future<String> future = pool.submit(new MyCallable());
try {
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}finally {
// 关闭线程池
pool.shutdown();
}
}