目录
概述
线程的概述
要讲什么是线程,那么就要先讲什么是进程
进程的概念如下
乍一看,好像还是没有明白啥是进程
又到了举栗子时间
比如我们平时在敲代码的时候,可能有的人会边听歌边敲代码
那么我们敲代码的编辑器和听音乐的软件就是两个进程
我们可以打开任务管理器,如下
我们会看到上面的图片中红色框框住的地方写的就是进程,这样懂了吧!
那什么是线程呢?
线程是比进程还要小的单位,一个进程可以包含很多个线程
说到这里我们要讲到时间片这个东西
CPU运行期间会分成很多的时间片,如下图
我们能够边敲代码,边听音乐的原因也是因为这个原因
程序在运行期间会去抢占时间片,由于时间片短
所以让用户从自身的角度出发感觉所有的程序在同时执行,其实并没有
这里采用了时间片轮转的方式,让你有了这种错觉
说是轮转,但是CPU的时间片的分配是随机的
Thread类和Runnable接口介绍
现在要讲到两个非常重要的东西,一个是Thread类,一个是Runnable接口
它们和线程创建的关系如下
下面介绍Thread和Runnable接口
在这里要说一个东西,就是在重写run方法之后
如果使用线程调用start方法,那么会自动调用重写之后的run方法
我查了一下资料,网上说源码中调用的start0方法是会通过虚拟机调用run方法
但是我发现start0方法没有方法体,所以也不太清楚(功力不够啊!惭愧)
这里还有一个东西记一下,那就是查看API文档的时候,发现这个东西
如果方法后面标上了Deprecated的就是过时的方法,不推荐使用,在以后可能会从JDK中删除的方法
线程的创建
通过Thread类创建线程
通过Thread类创建线程的方法就是对Thread类进行继承,然后重写里面的run方法
直接上代码吧!
public class NewThread extends Thread {
public NewThread(String name) {
super(name);
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
System.out.println(this.getName() + "运行" + i);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//第一步:创建线程
NewThread n=new NewThread("线程1");
NewThread m=new NewThread("线程2");
//第二步:跑起来
n.start();
m.start();
}
}
运行结果
从运行结果可以看出CPU分配时间片的方式是随机的
通过Runnable接口创建线程
先介绍一下为什么要使用Runnable接口实现线程吧!
因为在Java中是不支持多继承的,如果一个类继承了另一个类
但是同时想要创建线程,那么就实现不了
其实通过Runnable接口实现线程也要通过Thread这个类,要将实现Runable接口的类的实例作为参数放入Thread构造方法中
直接上代码吧!
public class RunnableThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++) {
System.out.println(Thread.currentThread().getName() + "运行" + i);
}
}
public static void main(String[] args) {
//第零步实现Runnable接口
//第一步创建实现Runnable接口对象
RunnableThread rt=new RunnableThread();
//第二步将接口对象放入Thread构造方法中
Thread t=new Thread(rt);
//第三步调用start方法
t.start();
}
}
从运行结果可以看出如果名字没有取名字,那么系统会自动给你命名
这里有一个疑问?
之前视频中老师的代码是这样的
你会发现一个java文件会有两个类
我查了一下资料,确实是可以这样写
但是不知道这具体是什么语法现象,找了半天没找到
文章在这里
https://www.cnblogs.com/weiweiyao/p/4303054.html