进程,线程进一步认识
参考,欢迎点击原文:https://www.cnblogs.com/qianqiannian/p/7010909.html(博客园)
继上一篇简单认识了下对进程和线程有个简单的认识后,如今又回头挖掘了下java这块对线程的进一步认识,整理如下
进程:是操作系统进行资源分配和调度的一个独立单位
进程组成:程序,数据集合,进程控制快(描述信息和控制信息)
基础认识: 进程获取信息资源,分配给线程,然后进程由线程来实现,一个进程可以包含多个线程,多个线程交流通信,线程开启不一定立即执行,由cpu调度执行,尽可能达到“并行”,来实现整个进程,所有线程结束,进程也就结束了。
进程,线程区别:
- 线程是程序执行的最小单位,进程是操作系统分配资源的最小单位
- 进程有至少有一个线程,且一个进程内线程共享内存空间
- 进程间相互独立
- 调度和切换:线程要比进程快得多
线程,进程之间的通信:
进程:使用信号,管道是半双工即一个方向流动,队列
线程:共享变量,volatile关键词,pipe
线程
线程有5种状态-生命周期阶段:
- 创建
- 就绪(等待cpu时间片运行,start方法后)
- 运行
- 阻塞(wait或者sleep)
- 终止
线程安全问题: 多个线程修改了数据,没来得及更新共享数据,同时别的线程使用了旧的数据,就出问题了,所以就诞生了加锁这个机制
Java使用多线程
java操作实现流程:
- 自定义类实现Thread类
- 在该类中重写run方法
- 调用start方法启动该线程
常用方法:
- start():1.启动当前线程2.调用线程中的run方法
- run():通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中
- currentThread():静态方法,返回执行当前代码的线程
- getName():获取当前线程的名字
- setName():设置当前线程的名字
- yield():主动释放当前线程的执行权
- join():在线程中插入执行另一个线程,该线程被阻塞,直到插入执行的线程完全执行完毕以后,该线程才继续执行下去
- stop():过时方法。当执行此方法时,强制结束当前线程。
- sleep(long millitime):线程休眠一段时间
- isAlive():判断当前线程是否存活
- synchronized实现加悲观锁,及等待释放锁
- wait():使用这个,当前线程进入阻塞状态,且开启同步监视器(只能在同步代码块或者同步方法中使用)
notify():执行这个,会唤醒一个wait状态的线程,优先唤醒优先级较高的线程
notifyAll():执行这个,会唤醒所有被wait的线程
runnable和callable
callable:重写call方法,new个线程池, submit提交,get获取结果【有返回值类型,需要抛异常】
runnable:1…2…3、new Thread(t1).start() //推荐避免单继承,可以同一个对象被多线程使用
List多线程修改会报并发修改异常,可使用以下类型
1、CopyOnWriteArrayList 写入时复制,读写分离
2、Collections. synchronizedlist(new Arraylist<>());
1、CopyOnWriteArraySet
1、ConcurrentHash Map
Java至少要用两个线程:
一个是jvm的main线程(用户线程),一个是GC垃圾收集、异常处理线程(守护线thread.setDeamon)
Tip:
- 如果jvm只剩下守护线程,则jvm将退出
- Yeid礼让不一定都成功
- 线程不能拿到方法的变量,只能拿到定义的final的变量
- countDownLatch(减法计数器,减到0才执行)
cyclicBarrier(加法计数器,加到定好的数字才执行)
semaphore(信号量,定数字如5)acquire先得到,再释放release==》限流