不多说,直接上代码 把代码复制过去运行下就知道了
package com.atguigu.gulimall.search.thread;
import java.util.concurrent.*;
/**
* @author rengang
* @version 1.0
* @date 2021/4/7 22:11
*/
public class ThreadTest {
//一般在项目启动时创建线程池根据需求创建一到几个 保证最大线程数量运行时不会宕机.并且可以
//通过压测等手段来测试多大线程数能达到系统的峰值 这里使用其中一种方式创建线程池作为例子
public static ExecutorService executorService = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws ExecutionException, InterruptedException {
Thread.sleep(1000);
System.out.println("----1----");
//初始化线程的四种方式
//1.继承Thread类
new Thread1().run();
Thread.sleep(1000);
System.out.println("----2----");
//2.实现Runnable接口
new Thread(new Runnable1()).start();
Thread.sleep(1000);
System.out.println("----3----");
//3.实现Callable接口加FutureTask(可以拿到返回结果,可以处理异常)
FutureTask<Integer> futureTask = new FutureTask<>(new Callable1());
futureTask.run();
//get()方法获取返回结果时阻塞式等待
System.out.println("futuretask返回结果:"+futureTask.get());
Thread.sleep(1000);
System.out.println("----4----");
//4.使用线程池
//后面基本项目的业务代码中都是使用线程池来进行线程的初始化,为什么呢?后面一节讲
executorService.execute(new Runnable1());
}
public static class Thread1 extends Thread{
@Override
public void run() {
int n = 10/4;
System.out.println("Thread-"+Thread.currentThread()+"的run方法中输出:"+n);
}
}
public static class Runnable1 implements Runnable{
@Override
public void run() {
int n = 10/4;
System.out.println("Runnable-"+Thread.currentThread()+"的run方法中输出:"+n);
}
}
public static class Callable1 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
int n = 10/4;
System.out.println("Callable-"+Thread.currentThread()+"的call方法中输出:"+n);
return n;
}
}
}

本文通过示例代码介绍了Java中实现多线程的四种方式:继承Thread类、实现Runnable接口、使用Callable接口结合FutureTask以及利用线程池ExecutorService。重点讨论了线程池的使用,并指出在实际项目中通常使用线程池初始化线程的原因。
472

被折叠的 条评论
为什么被折叠?



