线程学习知识点总结

说起线程,咱们得先了解一下几个词语:线程,进程,程序,多线程,多进程。 

  • 程序:是操作系统中实现多个功能的代码块,也叫软件
  • 进程:计算机上正在运行的程序
  • 线程:进程内的一个执行单元,也是进程内的可调度实体
  • 多进程:在计算机中并发运行的运行的多个进程
  • 多线程:在单个程序中同时运行多个线程完成不同的工作
  • 并发:计算机的cpu在运行程序的时候,会将时间划分为多个时间片段,而在这些时间片段中,每个时间片段中只能执行一个线程,对于线程来说,它们执行的时候是断断续续,走走停停的,但在宏观上来看,它们是一起执行的,像这样的多个进程同时执行,我们就称之为“并发”,一般发生在一个处理器中。
  • 并行: 在多个处理器中,每个处理器之间执行任务是互不影响的,在微观上来看它们是同时执行的。

线程的状态

  线程的状态至少有四种:新建状态,就绪状态,运行状态,(阻塞状态),死亡状态

  1.新建状态

    当线程被(new)创建的时候,此时的线程的状态为新建状态

      线程的创建方式有三种(有的书还有资料说只有两种)

        ①:继承Thread类

          通过继承Thread类,重写run方法(线程的主方法体),调用start()方法来启动线程。 

        ②:实现runnable接口

          通过实现runnable接口(任务接口),重写接口中的run()方法(线程任务的方法体),创建线程,然后将实现类的实例作为线程参数,然后调用start()方法启动线程

        ③:通过使用FutureTask

          使用FutureTask来创建线程,然后用Callable来创建任务(即重写callable中的call()方法,返回值为null),然后将FutureTask作为参数创建线程

  2.就绪状态

    当线程创建后,线程就进入新建状态,如果不调用线程的start()方法,线程就不会进入就绪状态。调用start()方法后线程进入可运行线程池进行等待获取cpu资源

  3.运行状态

    当线程获取到cpu资源后,线程就开始运行,但是每个线程并不一定是执行完了属于自己的线程体的内容,再去执行下一个线程(当要执行完线程体内容时间过短时)。每个线程被分为为若干个片段,它们获取到的cpu资源不能被其一直占有,它们运行的时候是走走停停,达到所谓的并发执行,且它们的执行次序与其获取cpu资源的概率(能力)有关,获取的概率越大,就执行的次数越多。

  4.死亡状态

    当线程的方法体执行完毕

  5.阻塞状态(并不是每一个线程都会有这种状态)

    ①.等待阻塞:当前线程所占用的cpu资源被剥夺,等待再次获得cpu。线程休眠

    ②.同步阻塞:锁对象被其他线程占用,当前线程等待其他线程释放锁对象

    ③.其他阻塞:sleep(),join().

附录:常用方法

线程中常用的方法

void

 run()

如果这个线程使用单独的Runnable运行对象构造,则调用该

Runnable对象的run方法; 否则,此方法不执行任何操作并返回

void

start()

导致此线程开始执行; Java虚拟机调用此线程的run方法。

long

 getId()

返回此线程的标识符

String

 getName()

返回此线程的名称

int

 getPriority()

返回此线程的优先级

Thread.State

getState()

返回此线程的状态
void   interrupt()中断这个线程

void

setDaemon()

设置为守护线程

void

 join()

等待这个线程死亡

void 

 sleep(long miles)

导致正在执行的线程以指定的毫秒数加上指定的纳秒数来暂停

(临时停止执行),这取决于系统定时器和调度器的精度和准确性

线程池

  为什么用线程池:

  在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这就是”池化资源”技术产生的原因。

  因此,顾名思义线程池就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。并且我们知道,当线程并发的数量达到一定的量之后,线程之间抢占cpu资源过于激烈,最后可能导致cpu资源不足从而导致阻塞,甚至导致“饿死”,然而使用线程池恰好能控这一点(线程池设置一个最大量),因此,线程池的使用是有必要的。

  线程池的创建:

  Java 5+中的Executor接口定义一个执行线程的工具。它的子类型即线程池接口是ExecutorService。要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,因此在工具类Executors面提供了一些静态工厂方法,生成一些常用的线程池.

  常用的线程池:

    newFixedThreadPool(int nThreads):创建一个线程池,该线程池重用固定数量的从共享无界队列中运行的线程。

    newScheduledThreadPool(int corePoolSize) :创建一个线程池,可以调度命令在给定的延迟之后运行,或定期执行。

    newCachedThreadPool() :创建一个根据需要创建新线程的线程池,但在可用时将重新使用以前构造的线程。

 

 

  

转载于:https://www.cnblogs.com/xiao-bd/p/9689004.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值