文章目录
`cho1.`基本问题`cho2.`CPU资源分配`cho3.`三种线程分布`cho4.`守护线程&用户线程`cho5.`线程的生命周期线程的创建线程的调度
`cho6.`常用方法一览
cho1.基本问题
什么是进程 程序执行时的一个实例,系统为每个进程分配不同的内存区域。什么是线程 进程中包括一个或多个线程,线程切换的开销小。什么是多线程 并行执行多个线程。 4.学习要点
多写代码练习,多次观察运行结果。 理解时候利用画图,思路会比较清晰。 线程并发是重点(这里我没有细说,后面补充)
cho2.CPU资源分配
系统中存在多个进程,CPU为每个进程分配内存区域。 进程获得的内存区域具有共享区域,每个线程具有各自独立的栈区。 共享区域分为三段:
代码段:存放代码、常量。数据段:存放全局变量、静态变量。扩展段:堆存储。
线程的栈区存储着线程内的局部变量、临时变量。
cho3.三种线程分布
单线程程序 一个简单那的程序,只具有一个基本的main线程。所有的程序一定存在一个主线程。基本Java程序 Java程序本身具有垃圾回收机制和异常机制。因此,基本的Java程序,具有以下三个线程:
main:主线程。 gc:垃圾回收线程。 exception:异常处理线程。
多线程Java程序 在基本的Java程序基础上,增加多个线程。
cho4.守护线程&用户线程
线程分为两类:守护线程、用户线程。 守护线程为用户线程服务,用户线程使用setDeamon(true),可以将用户线程设置为守护线程。 常见的守护线程:垃圾回收线程。 当JVM中只存在守护线程,则JVM退出;守护线程会随主线程一起消亡。
cho5.线程的生命周期
参考链接:多线程(一):创建线程和线程的常用方法 这里只做简略描述,更多细节可以去参考链接中查看,本部分很多内容都借鉴了该链接。
线程的创建
方式一:(不推荐)
继承Thread类。重写run方法。创建线程对象。调用start方法:启动线程,调用run方法。
方式二:(线程无返回值) 1)实现Runnable接口。 2) 重写run方法。 3) 通过含参构造器创建线程对象。 4) 调用start方法 Thread implements Runnable
方式三:(线程有返回值) 1)实现Callable接口。 2)重写call方法。 3)使用FutureTask封装线程对象。 4)使用Thread封装futureTask对象。 5)调用start方法。 FutureTask implements RunnableFuture RunnableFuture extends Runnable
线程的调度
线程调度策略:优先级高的线程,抢占CPU资源。调度方法:
优先级相同,按照等待队列先进先出。 优先级高,优先调度抢占策略。
优先级范围1(Min)-10(Max)相关方法:getPriority/setPriority子类线程继承父类线程的优先级。
cho6.常用方法一览
方法名说明
start启动一个线程,将线程加入线程队列run线程的主体操作内容,即线程体getName获取线程名称setName设置线程名称currentThread返回当前线程实例sleep线程进入休眠,保留同步锁interrupt打断线程休眠,进入就绪状态wait线程进入等待状态,释放同步锁。该方法必须写在synchronized内。notify唤醒休眠或者等待的线程。该方法必须写在synchronized内。join若在A线程执行时,调用了B线程的join,则A线程等待阻塞,直到B线程结束,A线程才会进入执行状态。yield让线程进入就绪状态,不会释放锁。setDaemon将线程设置为守护线程。
多线程的三个案例