初始化线程的4种方式
一、继承Thread接口
/**
* 继承Thread接口
*/
public static class Thread01 extends Thread{
@Override
public void run() {
System.out.println("当前线程" + Thread.currentThread().getId()); // 当前线程11
int i = 10/2;
System.out.println("运行结果 : "+i); // 运行结果 : 5
}
}
// 测试
public static void main(String[] args) {
System.out.println("main 线程 : "+Thread.currentThread().getId()); // main 线程 : 1
Thread01 thread01 = new Thread01();
thread01.start(); //启动线程
}
二、实现Runnable接口
/**
* 实现Runnable接口
*/
public static class Runnable01 implements Runnable{
@Override
public void run() {
System.out.println("当前线程" + Thread.currentThread().getId()); // 当前线程11
int i = 10/2;
System.out.println("运行结果 : "+i); // 运行结果 : 5
}
}
//测试
public static void main(String[] args) {
Runnable01 runnable01 = new Runnable01();
Thread thread = new Thread(runnable01);
thread.start();
}
三、实现 Callable接口,FutureTask可以拿到返回结果
FutureTask可以拿到返回结果,可以处理异常
futureTask.get()阻塞等待整个线程执行完成,获取返回结果
/**
* 实现Callable接口
*/
public static class Callable01 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println("当前线程" + Thread.currentThread().getId()); // 当前线程11
int i = 10/2;
System.out.println("运行结果 : "+i); // 运行结果 : 5
Thread.sleep(5000);
return i;
}
}
// 测试
public static void main(String[] args) throws ExecutionException, InterruptedException {
Callable01 callable01 = new Callable01();
FutureTask<Integer> futureTask = new FutureTask<>(callable01);
Thread thread = new Thread(futureTask);
thread.start(); //启动线程
Integer integer = futureTask.get(); //获取返回结果
System.out.println(integer); // 5
}
四、线程池【ExecutorService】
线程池直接提交任务
我们的业务代码中,以上三种启动线程的方式都不用。避免启动线程消耗太多的资源,节约资源给更核心的业务。将所有的多线程异步任务都交给线程池执行
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.execute(new Runnable01());
}
/**
* 实现Runnable接口
*/
public static class Runnable01 implements Runnable{
@Override
public void run() {
System.out.println("当前线程" + Thread.currentThread().getId()); // 当前线程11
int i = 10/2;
System.out.println("运行结果 : "+i); // 运行结果 : 5
}
}
总结
- 1,2不能得到返回值,3可以获取返回值
- 1,2,3都不能控制资源
- 4可以控制资源,性能稳定。