多线程
### 多线程:
- 程序:一个可执行文件
- 进程:一个正在运行的程序,也可以理解成为内存中的开辟的存储空间
- 线程:负责程序的运行,可以看作是一条执行的通道或执行单元,所以我们通常将进程的工作理解成线程的工作。
进程中可不可以没有线程?必须有线程,至少有一个,当有一个线程的时候我们称为单线程(唯一的线程就是主线程)当有一个以上的线程同时存在的时候我们称为多线程
- 任务区:就是run()方法,我们将线程工作的地方称为任务区。每一个线程都有一个任务区,任务区通过对应的方法产出作用。
* JVM默认是多线程吗?
* 至少要有两个线程:
* 主线程:任务区:main函数
* 垃圾回收线程:任务区:finalize函数
线程实现的意义就是干活
- 当线程没有结束的时候,进程也不能结束。线程之间都是在抢CPU因为CPU有随机性。
创建线程
默认情况下,主线程和垃圾回收线程都是由系统创建的,但是我们需要完成自己的功能----创建自己的线程对象,ava将线程面向对象了,形成的类就是Thread,在Thread类内部执行任务的方法叫run().
注意1:如果想让run作为任务区,必须让他去被自动调用.我们通过执行start()方法,来开启线程,继而实现run方法的自动调用.
主线程的名字:main 子线程的名字:从Thread-0开始命名
1. 直接使用Thread();创建对象,创建线程,然后.start(),开启线程。
2. 使用子类对象创建对象,重写 run()方法,实现我们的功能,run就是我们的任务区。
1.Thread.currentThread():获取的是当前的线程
2.Thread.currentThread().getName():线程的名字
注意2:run()方法本来是空的,它里面的存放的是线程要做的工作,所以这里必须继承Thread,重写run()方法
注意3:run()方法不能手动创建?因为如果我们手动调用run()方法的时候,它失去了任务区的功能,变成了一个普通的方法,其方法还是运行在主线程中,代码在程序中是顺序执行的,所以不会有解决耗时操作的问题。所以不能直接调用线程的run()方法,只有子线程开始了,才会有异步的效果,当thread.start()方法执行了以后,子线程才会执行run()方法,这样的效果和在主线程中直接调用run()方法的效果是截然不同的。
实现多线程的方式两种:
- 第一种方法:通过创建Thread子类的方式实现功能–线程和任务绑定在一起,操作不方便。当多个线程要执行一个任务时,创建多个线程,这是就会有多个任务,虽然能定义一个static变量来实现你需要的功能,但是不符合逻辑。
public class Demo5 {
public static void main(String[] args) {
SubThread t0 = new SubThread();
SubThread t1 = new SubThread();
SubThread t2 = new SubThread();
SubThread t3 = new SubThread();
//开启线程
t0.start();
t1.start();
t2.start();
t3.start();
}
}
class SubThread extends Thread{
static int sum = 20;//大家共用这个变量
@Override
public void run() {