线程与进程
进程
是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间
线程
是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少有一个线程
线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程
线程调度
分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
CPU使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核新而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是 在同一时刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的 使用率更高。
这样说不够直观,我现在用代码来solo:
主线程的代码:
public class Demo3 {
/**
* 主线程
* @param args
*/
public static void main(String[] args) {
MyThread myThread =new MyThread();
myThread.start();
for (int i =0;i<10;i++){
System.out.println("那是必须的"+i);
}
}
MyThread的代码
public class MyThread extends Thread{
/**
* 这个执行路径触发方法 是通过调用 start
*/
@Override
public void run() {
for (int i= 0;i<10;i++){
System.out.println("小浪真帅"+i);
}
}
最终的效果:
现在理解了什么叫抢占式调度了吧,每个进程都有自己的堆空间,共用一份堆内容.
思考:一千个事件同时让八个cpu实现对多进程进行切换速度块,还是进行排队速度快?
答案是:排队效率更高 假如 一次切换只能完成时间的1%,则需要切换10w很浪费时间,但是如果排队去做,就只需要切换1000次.
同步与异步
同步
排队执行 , 效率低但是安全.
异步
同时执行 , 效率高但是数据不安全.
并发与并行
并发
指两个或多个事件在同一个时间段内发生。
并行
指两个或多个事件在同一时刻发生(同时发生)。
多线程技术
前面在实现时采用了继承Thread的方式
实现Runnable 与继承Thread相比有如下优势:
- 可以创建任务,然后给线程分配的方式实现的多线程,更适合多个线程同时执行相同任务的情况
- 可以避免单继承带来的局限性
- 任务与线程本身是分离的,提高程序的健壮性
- 线程池技术 ,接受Runnable任务,不接受Thred类型的线程
具体实现看下面:
package work.february.three;
/**
* @Author: 小浪
* @Description:
* @Date Created in 2021-02-03 19:39
* @Modified By:
*/
public class Demo4 {
public static void main(String[] args) {
//实现 Runnable
//1. 创建一个任务对象
MyRunnable myRunnable =new MyRunnable();
//2. 创建一个线程,并为其分配任务
Thread thread =new Thread(myRunnable);
thread.start();
for (int i =0;i<10;i++){
System.out.println("那是必须的"+i);
}
}
}
package work.february.three;
/**
* @Author: 小浪
* @Description:
* @Date Created in 2021-02-03 19:39
* @Modified By:
*/
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i= 0;i<10;i++){
System.out.println("小浪真帅"+i);
}
}
}
附赠一篇线程玩法:
看到这里了,就不要吝啬手里的赞了,给个免费的赞和关注吧!如果有什么问题可以联系小浪:[email protected],或者私信.