1. 继承 Thread 类:
继承 Thread 类,重写 run 方法:
class MyThread01 extends Thread {
@Override
public void run() {
super.run();
}
}
public class Test01 {
public static void main(String[] args) {
MyThread01 t1 = new MyThread01();
t1.start();
}
}
2. 实现 Runnable 接口:
实现 Runnable 接口,重写 run 方法,其思路是解耦合,将线程和线程要干的活分开
class MyRunnable implements Runnable{
@Override
public void run() {
// 要执行的任务
}
}
public class Test02 {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread t2 = new Thread(myRunnable);
t2.start();
}
}
3. 实现 Callable 接口:
实现 Callable 借楼,重写 call() 方法。
Callable 接口是 Java 中的一个泛型接口,用于定义一个可以返回结果并可能抛出异常的任务。Callable 接口的 call() 方法可以返回一个结果,并且可以抛出异常。Callable 接口的实现类需要实现 call() 方法,该方法在执行时会返回一个 Future 对象,通过该对象可以获取到计算结果 。
class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
// 要执行的任务
return 0;
}
}
public class Test03 {
public static void main(String[] args) {
MyCallable myCallable = new MyCallable();
//FutureTask的原理可以简单描述为:
// 它接受一个Callable或Runnable对象作为参数,
// 在执行器线程中执行该对象,并返回一个Future对象,
// 通过该对象可以获取到计算结果。
FutureTask<Integer> futureTask = new FutureTask<>(myCallable);
Thread t3 = new MyThread01();
t3.start();
}
}
4. 使用线程池:
public class Test04 {
public static void main(String[] args) {
// 先创建线程池,包含五个线程
ExecutorService executorService = Executors.newFixedThreadPool(5);
executorService.execute(new Runnable() {
@Override
public void run() {
// 执行的任务
}
});
// 执行完毕关闭线程池
executorService.shutdown();
}
}
5. 使用匿名类:
public class Test05 {
public static void main(String[] args) {
new Thread() {
@Override
public void run() {
// 要执行的任务
}
}.start();
}
}