- 继承 Thread 创建 线程 类
创建一个类,继承Thread类,并重写该类run方法,run方法里面就代表了线程需要完成的任务,具体代码如下:
public class TestThread extends Thread{
@Override
public void run() {
super.run();
}
public static void main(String[] args) {
TestThread t1 = new TestThread();
t1.start();
}
}
- 通过Runnable接口创建线程类
创建一个类,实现Runnable接口,一样重写run方法,和上面一样这里run也代表线程需要完成的任务,具体代码如下:
public class TestThread2 implements Runnable{
@Override
public void run() {
}
public static void main(String[] args) {
TestThread2 runnable = new TestThread2();
Thread t2 = new Thread(runnable);
t2.start();
}
}
- 使用Callable和Future创建线程类
注意:和Runnable接口不一样的是,Callable接口提供一个call()方法来作为线程的执行体,它还有返回值
首先创建一个类,实现Callable接口;第二步使用FutureTask来包装Callable对象,为什么要这么做,是为通过FutureTask的内置方法获取Callable接口的返回值;使用Thread类传入FutureTask来创建并启动线程。具体代码如下:
public class TestThread3 implements Callable<String> {
@Override
public String call() throws Exception {
return "hello world";
}
public static void main(String[] args) {
TestThread3 callable = new TestThread3();
//通过futureTask取到callable接口的返回值
FutureTask futureTask = new FutureTask(callable);
Thread t = new Thread(futureTask);
t.start();
}
}
- 使用 线程池 创建线程
首先创建一个类,实现Runnable或者Callable接口,然后把这个执行体放到线程池执行,具体代码如下:
public class TestThread4 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
//()->" hello world ",这个是lambda简写,代表一个实现Runnable接口的类
executorService.submit(()->"hello world");
}
}
总结:我们可以看出,不管使用哪种方式我们都需要实现线程需要具体执行的方法(一般称之为线程执行的任务)。实际项目中的最佳实践是,通过线程池来管理线程创建销毁,接口实现类(Runable、Callable)来创建线程任务,不用Thread类,原因很简单 Java 中只允许单继承没有接口灵活
如果内容对您有帮助,希望您能点赞收藏加关注,激励作者创作出更加优质内容,谢谢!