线程基础、线程之间的共享和协作(初篇)

什么是进程和线程?

进程是操作系统进行资源分配的最小单位。资源包括cpu,内存空间,磁盘io等。同一进程里的多个线程共享该进程的全部系统资源。而进程与进程之间是相互独立的。

线程是cpu调度的最小单位,必须依托于进程而存在。

CPU 核心数和线程数的关系?
核心数、线程他们是1:1的关系,当intel引入超线程技术后 核心数、线程他们是1:2的关系。
什么是CPU 时间片轮转机制?
我们平时在开发的时候,感觉并没有受 cpu 核心数的限制,想启动线程就启 动线程,哪怕是在单核 CPU 上因为操作系统提供了一种 CPU 时间片轮转机制。时间片轮转调度是一种最古老、最简单、最公平且使用最广的算法,又称 RR调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则 CPU 将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结来,则 CPU 当即进行切换。而CPU的调度切换就是CPU上下文切换。
什么并行和并发?
并行是指同时能够执行不同的任务。并发是指能够交替的执行任务。 两者区别 : 一个是交替执行 , 一个是同时执行。其中 并发统计通常和时间单位挂钩的。某一时间段并发量是多少。 

线程的优点及缺点?

线程的创建会进行资源分配:栈空间(1M)+ 句柄(文件描述符)等

优点:

1.充分利用cpu资源。

2.加快用户响应时间。

3.代码的异步话,模块化,简单化。 

缺点:

1.多个线程共享该进程的所有资源,共享资源的安全性。

2.为了保证共享资源的安全性,肯定会加锁,容易产生线程与线程之间死锁。

3.线程数量增加会加重系统cpu资源的消耗。

线程创建的方式?

线程的创建方式就只有2种,这个是官方Thread类注释声明了的。可以去Thread源码看下。

1.继承Thread类

2.实现Runnable接口

Thread和Runnable的区别?

Thread是对线程的抽象,而Runnable是对任务调度的抽象。Thread可以接收任意Runnable的实例执行。

线程终止的方式?

1.调用线程的stop方法,stop方法不建议使用,它不能保证线程资源的释放。除非把线程的资源都释放了才调用stop方法。

2.调用interrupt方法,它不能保证线程马上终止,它只是给线程一个中断的通知,修改线程的中断标志位。interrupt方法通常和isInterrupted()和静态方法Thread.interrupted()联合调用。

代码示例:

 线程通过检测自身的中断标识位是否设置为true而响应中断。通常通过调用isInterrupted()和静态方法Thread.interrupted()方法来判断是否被中断。isInterrupted()与interrupted()区别在于返回值不一样,isInterrupted()会返回true而interrupted()会把标志位修改成false来返回。通常情况下都选择使用isInterrupted方法。

线程在堵塞中(线程调用wait(),sleep(),join())也会执行interrupt和isInterrupted/Thread.interrupted()方法,但该线程并不会中断。线程处于堵塞状态,它对检测当前中断标志位是否设置为true,会在阻塞方法调用处抛出中断异常并把中断标识为马上设置成false。如果要把堵塞的线程中断必须在catch代码块里再次调用interrupt()方法。相当于要调用两次interrupt()方法;

示例:

 线程的run方法和start()方法的区别?

Thread类是对java线程的抽象,new Thread()实例只是把线程挂载起来,并没有真正的执行。当线程调用start()方式时,线程才是真正的启动起来。start()方法让线程处于就绪状态等待cpu分配资源,分配到cpu资源时才会调用run方法。start()方法不能重复调用,否则抛出异常,而run()可反复调用它相当于类里的一个成员方法。

其他线程方法?

join():可以将两个交替执行的线程合并为顺序执行。 比如在线程 B 中调用了线程 A 的 Join()方法,直到线程 A 执行完毕后,才会继续执行线程 B。

yield()使当前线程让出 CPU 占有权,但让出的时间是不可设定的。也不会释放锁资源。注意:并不是每个线程都需要这个锁的,而且执行 yield( )的线程不一定就会持有锁,我们完全可以在释放锁后再调用 yield 方法。所有执行 yield()的线程有可能在进入到就绪状态后会被操作系统再次选中马上又被执行。

线程运行结构图 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrl+C+V程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值