简介
👨💻个人主页:@云边牧风
👨🎓小编介绍:欢迎来到云边牧风破烂的小星球🌝
📋专栏:Java基础知识
🔑本章内容:线程
记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~
本节多线程编程内容有:
7.1.1 线程的概念
7.1.2 Thread类与Runnable接口
7.1.3 线程的生命周期
一、多线程编程基础
多线程是指同一个程序同时存在几个“执行体”,它们可以“同时”工作。
在早期的单核CPU上,这些执行体是轮流执行的,因为计算机同一时刻只能执行一个线程,但是CPU执行速度是很快的,通过快速轮转,给人感觉上是“同时”工作的。
现在的多核CPU上,可以实现真正的多线程并行执行。
1、啥是进程和线程?
搞清楚进程之前先看下边这张图👇:
引入操作系统与进程概念:
程序是静态的,进程是程序的一次动态执行
一个程序的每一次运行称为一个进程
例如:一边用Word一边听MP3,那么系统中会存在Word和播放器两个进程
一个进程要占用一部分处理器时间和内存资源
线程是比进程更小的执行单位
2、线程
一个程序中 多段代码同时并发执行 ,称为 多线程
通过多线程,一个进程可以同时执行一个以上的任务(称为“并发”)
创建线程比创建进程开销要小得多,线程之间的协作和数据交换也比较容易
一个进程可以包含多个线程,它们共享进程资源
3、主线程
每个Java应用程序都有一个缺省的主线程
当 JVM 加载代码,发现 main 方法之后,就会启动一个线程,这个线程就是“ 主线程 ”
主线程负责执行main方法,在main方法的执行中再创建的线程称为其他线程,JVM调度各线程轮流执行
说白了:在前面遇到的Java文件中,只有main是大佬,所有的类都要听他安排——这个main运行时,就相当于启动了一个线程,而main线程就是主线程
例如:
class Kitty {
public void run() {
for (int i = 1; i <= 50000; i++)
if(i % 10000 == 0)
System.out.println("小喵猫猫叫~"); }
}
class Puppy {
public void run() {
for (int i = 1; i <= 50000; i++)
if(i % 10000 == 0)
System.out.println("狗狗汪汪叫~"); }
}
这些都称之为:“其他线程”
只有下面的
public static void main(String[] args) {
Kitty k = new Kitty();
Puppy p = new Puppy();
k.run();
p.run();
for (int i = 1; i <= 50000; i++)
if(i % 10000 == 0)
System.out.println(
"主人嗷嗷喊~~~");
}
main才是主线程
运行结果为:
从上面的运行结果可以看出:代码是一块一块运行行(一行一行跑的),只有执行完上一步才能进行下一步,但在现实中往往会遇到需要交错运行的代码,那怎么办呢?
4、试试线程
将上面的代码改为:
class Kitty extends Thread{
public void run() {
for (int i = 1; i <= 50000; i++)
if(i % 10000 == 0)
System.out.println("小喵猫猫叫~"); }
}
class Puppy extends Thread{
public void run() {
for (int i = 1; i <= 50000; i++)
if(i % 10000 == 0)
System.out.println("狗狗汪汪叫~"); }
}
public static void main(String[] args) {
Kitty k = new Kitty();
Puppy p = new Puppy();
k.start();
p.start();
for (int i = 1; i <= 50000; i++)
if(i % 10000 == 0)
System.out.println(
"主人嗷嗷喊~~~");
}
//注意这里的extends Thread:Kitty和Puppy都继承了Thread类,我们看看运行结果有何不同:
我们发现这个运行已经不是一条一条跑了,而是有些是同时运行或者交叉运行了。这就是线程管的事了
那为什么会有这样的效果呢?这里就要看下一节(第七章第2节)Thread类与Runnable接口
结束语:
以上是Jav第七章第1节的全部内容 希望大家喜欢
下一节讲(第七章第2节)——Thread类与Runnable接口
喜欢的可以点赞+关注哈 ❤