多线程基础概念与认识
Posted 烟锁迷城
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程基础概念与认识相关的知识,希望对你有一定的参考价值。
1、进程与线程
1.1、进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。线程是进程的最小单位,一个进程有多个线程组成,它至少包含一个线程。
- 对于单核CPU而言,多线程就是不断分配时间片来切换线程。
- 对于多核CPU而言,多线程就是多核心并行执行,每一个核心处理一个线程。
1.2、线程
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
- 在多核CPU中,利用多线程可以实现真正意义上的并行执行
- 在一个应用进程中,会存在多个同时执行的任务,如果其中一个任务被阻塞,将会引起不依赖该任务的任务也被阻塞,通过对不同任务创建不同的线程去处理,可以提升程序处理的实时性。
- 线程可以认为是轻量级的进程,所以线程的创建、销毁比进程更快
1.3、多线程
多线程可以有效的提升程序运行的效率,在JAVA中是一种非常常用的编程方法
- 实现异步执行
- 利用多CPU资源实现真正意义上的并行执行
1.4、应用场景
多线程应用场景
- 使用多线程实现文件下载
- 后台任务,如发送邮件,短信
- 异步处理,如日志记录
- 多步骤的任务处理,可根据步骤特征选用不同个数和特征的线程来协作处理,多任务的分割,由一个主线程分割给多个线程完成
2、具体实现
2.1、thread类
线程可以通过继承thread类,重写run方法,用start方法来进行调用。
public class ThreadDemo extends Thread{
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread show");
}
public static void main(String[] args) {
ThreadDemo threadDemo = new ThreadDemo();
threadDemo.start();
System.out.println("main show");
}
}
2.1、runnable接口
实现Runnable接口后,重写run方法,用tread类的start方法进行调用
public class RunnableDemo implements Runnable {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread show");
}
public static void main(String[] args) {
RunnableDemo runnableDemo = new RunnableDemo();
new Thread(runnableDemo).start();
System.out.println("main show");
}
}
2.3、Callable接口
实现Callable接口,重写call方法,可以实现有返回值的线程,但是要注意,这里future的get方法是阻塞的,因为需要返回值。
import java.util.concurrent.*;
public class CallableDemo implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(2000);
return "callable show";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(1);
CallableDemo callableDemo = new CallableDemo();
Future<String> future = executorService.submit(callableDemo);
System.out.println(future.get());
System.out.println("main show");
}
}
3、生命周期
java线程有六种状态,分别是new(创建),runnable(运行),time_waiting(超时等待),waiting(等待),blocked(阻塞),terminated(死亡)。
系统线程的五种状态,分别是新生,就绪(ready),运行(running),等待(waiting),死亡。
- 一个线程先被创建,然后进入运行(分为就绪,运行两种)状态
- 加锁(synchronized修饰)会进入阻塞状态
- 使用不带等待时间的等待函数sleep(0),wait(),join(),LockSupport.park()会进入等待状态
- 使用加入唤醒时间的等待函数sleep(time),wait(time),join(time),LockSupport.parkUntil(time)会进入超时等待状态
- notify(),notifyall(),LockSupport.unpark()可以唤醒沉睡中的线程,使之进入运行(分为就绪,运行两种)状态
- run函数运行结束后,线程进入死亡状态。
以上是关于多线程基础概念与认识的主要内容,如果未能解决你的问题,请参考以下文章