学习之路(二):并发编程——第一章:线程基础、线程之间的共享和协作(一)

所有的努力都不会完全白费,你付出多少时间和精力,都是在对未来的积累。世界上什么都不公平,唯独时间最公平,你是懒惰还是努力,时间都会给出结果。

线程基础、线程之间的共享和协作

基础概念

什么是进程?
答:进程是操作系统进行资源分配的最小单位。
什么是线程?
答:线程是CPU调度的最小单位,必须依赖于进程而存在。
CPU核心数和线程数的关系
答:核心数和线程数一边情况下是1:1的对应关系,即四核CPU一般拥有四个线程。但是Intel引入超线程技术后,核心数和线程数为1:2。
增加核心数的目的就是为了增加线程数,因为操作系统时通过线程来执行任务。
CPU时间片轮转机制
答:即为RR调度,每个进程被分配一个时间段,称它为时间片,即该进程允许运行的时间。
什么是并行?
答:并行指应用能够同时执行不同的任务。
什么是并发?
答:指应用能够交替执行不同的任务。
并行和并发的区别?
答:并发是交替执行,并行是同时执行。
高并发编程的意义、好处、注意事项
答:
1.充分利用CPU的资源;
2.加快响应用户的时间;
3.可以使你的代码模块化,异步化,简单化。
注意事项:
1.线程之间的安全性
2.线程之间有可能会发生死锁
3.线程太多会将服务器的资源耗尽,形成死机、宕机。

Java里的线程

java程序天生就是多线程的
一个Java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但是实际上Java天生就是多线程程序,因为执行main()的是一个名称为main的线程。
Thread和runnable有什么区别
Thread是对线程的抽象
Runnable是对任务(业务逻辑)的抽象
线程的启动与中止
启动线程的方式有:
1.X extends Thread; 然后X.start();
2.X implements Runnable ;然后交给Thread运行
X x = new X()
new Thread(x).start();
中止
尽量不要使用stop、suspend、resume等。
使用interrupt()方法对线程进行终端,使用isinterrupt()来判断是否被终端。
不建议自定义一个取消标志位来中止线程的运行。
注意:处于死锁状态的线程无法被中断。
run()
run方法实际上就是线程中业务逻辑实现的地方,本质上和任意一个类的任意一个方法没有任何区别,可以重复执行,也可以单独调用。
start()
start方法是让一个线程进入就绪队列等待分配cpu,分到cpu后才调用实现的run方法,start方法不能被重复调用,会抛出异常。
yield()
yield方法会让当前线程让出CPU的占有权,让出时间不可定,不会释放锁资源。所有执行yield方法的线程会进入到就绪状态,可能会又被操作系统再次选定,从而继续执行。
注意:不是每个线程都需要这个锁,而且执行yield的现场不一定就会持有锁,我们完全可以在释放锁之后调用yield方法。
join()
把指定的线程加入到当前的现场,可以将两个交替执行的现场合并为顺序执行。比如:线程B调用了线程A的join方法,直到线程A执行完毕后,才会继续执行线程B
守护线程
守护线程是一种支持性线程,因为它主要被用作程序中后台调度以及支持性工作。

线程间的共享和协作

synchronized 内置锁
被关键字synchronized修饰的方法或者以同步块的形式来进行使用,他主要确保多个线程在同一时刻只有一个线程处于方法中,它保证了线程对变量访问的可见性和排他性,称为内置锁机制。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值