线程的创建方式通常包括以下几种:

  1. 继承Thread类:创建一个继承自Thread类的子类,并重写其run()方法来定义线程执行的任务。然后通过创建子类的实例并调用start()方法来启动线程。
class MyThread extends Thread {
    public void run() {
        // 线程执行的任务
    }
}

// 创建并启动线程
MyThread myThread = new MyThread();
myThread.start();
  1. 实现Runnable接口:定义一个实现了Runnable接口的类,然后实例化该类,并传递给一个Thread对象。最后调用Thread对象的start()方法来启动线程。
class MyRunnable implements Runnable {
    public void run() {
        // 线程执行的任务
    }
}

// 创建并启动线程
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
  1. 实现Callable接口:与Runnable接口类似,Callable接口也可以用来创建线程,但它可以返回执行结果或抛出异常。通过ExecutorService的submit方法可以提交Callable任务,并获取返回的Future对象。
Callable<Integer> callable = () -> {
    // 线程执行的任务
    return 42;
};

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(callable);
  1. 使用匿名内部类:可以使用匿名内部类来实现Runnable接口或直接继承Thread类,这样可以在较短的代码中创建和启动线程。
// 使用匿名内部类创建线程
Thread thread = new Thread(new Runnable() {
    public void run() {
        // 线程执行的任务
    }
});
thread.start();

除了上述的基本方式外,Java 5 引入了Executor框架,使得以更高级的方式来管理和调度线程,比如使用ThreadPoolExecutor来控制线程池中的线程数量,以及ScheduledThreadPoolExecutor来支持定时任务等。

这些都是常见的线程创建方式,开发者可以根据具体的需求和场景来选择合适的方式来创建线程。