多线程简单入门
目录
线程和进程
进程相当于N个线程。
例如:每个软件启动后就相当于一个进程,里面多个模块就相当于多个线程。
进程是线程的集合,每一个线程是进程中的一条执行路径。
多线程作用
合理利用多线程可以提高程序的执行效率。
应用场景
异步实现发送短信;
异步实现记录日志;
异步请求后端接口耗时较长的接口,缩短时间等~
快速提高HTTP协议的响应,提升用户体验。
因为Http默认情况下采用同步的形式,整个过程就是基于请求与响应的过程。
如果服务器端没有及时的响应客户端,就会造成客户端一直处于等待状态,这样会导致用户体验很不友好。
多线程的几种状态
多线程的几种实现方式
- 继承Thread类,重写run方法;
- 实现Runnable接口,重写run方法;
- 使用匿名内部类;
- 可以带返回结果的线程Callable;
- 线程池;
- 其他扩展方式~
注:使用run方法时是不能throw抛异常的,需要使用try/catch去捕获异常。
一般用实现Runnable接口创建线程比较好,因为继承Thread类后不可再继承,实现Runnable接口后还可以继承。
继承Thread类。
运行结果:
注:线程1、2同时执行,根据cup资源随机分配执行。
实现Runnable接口
注:运行结果和继承Thread类类似,实现Runnable接口开启线程要强转为Thread,因为Runnable接口是Thread的实现类。实现Runnable接口用Thread.currentThread().getName(),currentThread()方法获取线程对象,getId()获取线程id是JVM底层分配getName()获取线程名称,打印日志时一定要打印线程id,方便bug查看。
实现Callable
public class CallableTest implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("子线程"+Thread.currentThread().getName()+",开始运行!");
Thread.sleep(3000);
return "Callable返回结果!";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> futureTask = new FutureTask<>(new CallableTest());
new Thread(futureTask).start();
// 获取线程返回结果
System.out.println(futureTask.get());
}
}
运行结果:
使用匿名内部类创建线程
运行结果:
注:如文章有误,欢迎批评指正,欢迎交流。