赞
踩
计算机的很多知识是相通的,比如多线程与多进程,在Linux中查看进程和线程的方式更为直观,比如使用top命令与ps命令
那么进程与线程究竟该怎么理解呢?
设想一下,我需要打开我的笔记本,那么按下按钮的时候,就开启了“开机”这个进程号为1的进程
在开机的过程中,电源模块线程与CPU运算调度线程以及其他的好多线程一起完成了这个任务
总之,进程是“粗壮”的,线程是“多的”
进程和线程是包含关系,但是多任务既可以由多进程实现,也可以由单进程内的多线程实现,还可以混合多进程+多线程。
和多线程相比,多进程的缺点在于:
而多进程的优点在于:
Java语言内置了多线程支持:一个Java程序实际上是一个JVM进程,JVM进程用一个主线程来执行main()方法,在main()方法内部,我们又可以启动多个线程。
此外,JVM还有负责垃圾回收的其他工作线程等。
因此,对于大多数Java程序来说,我们说多任务,实际上是说如何使用多线程实现多任务。
多线程模型是Java程序最基本的并发模型,后续读写网络、数据库、Web开发等都依赖Java多线程模型。
这也是为什么大多数时候Java总是讨论多线程的原因。
使用代理设计模式
两种实现方式哪种用的比较多
推荐使用第二种方式,
1、java是单继承,将继承关系留给最需要的类
2、使用runnable接口之后不需要给共享变量添加static关键字,每次创建一个对象,作为共享对象即可
新生状态:
当创建好当前线程对象之后,没有启动之前(调用start方法之前)
ThreadDemo thread = new ThreadDemo()
RunnableDemo run = new RunnableDemo()
就绪状态:准备开始执行,并没有执行,表示调用start方法之后
当对应的线程创建完成,且调用start方法之后,所有的线程会添加到一个就绪队列中,所有的线程同时去抢占cpu的资源
运行状态:当当前进程获取到cpu资源之后,就绪队列中的所有线程会去抢占cpu的资源,谁先抢占到谁先执行,在执行的过程中就叫做运行状态
抢占到cpu资源,执行代码逻辑开始
死亡状态:当运行中的线程正常执行完所有的代码逻辑或者因为异常情况导致程序结束叫做死亡状态
进入的方式:
1. 正常运行完成且结束
2. 人为中断执行,比如使用stop方法
3. 程序抛出未捕获的异常
阻塞状态:在程序运行过程中,发生某些异常情况,导致当前线程无法再顺利执行下去,此时会进入阻塞状态,进入阻塞状态的原因消除之后,
所有的阻塞队列会再次进入到就绪状态中,随机抢占cpu的资源,等待执行
进入的方式:
1. sleep方法
2. 等待io资源
3. join方法(代码中执行的逻辑)
在多线程的时候,可以实现唤醒和等待的过程,但是唤醒和等待操作的对应不是thread类
而是我们设置的共享对象或者共享变量
多线程并发访问的时候回出现数据安全问题:
解决方式:
1. 同步代码块
synchronized(共享资源、共享对象,需要是object的子类){具体执行的代码块}
2. 同步方法
将核心的代码逻辑定义成一个方法,使用synchronized关键字进行修饰,此时不需要指定共享对象
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。