文章目录

进程和线程

进程就是某个应用程序从还没开始运行,到运行结束的整个过程

可以存在多个进程,但多个进程的执行,其实是高频率的切换,并不是真正意义上的“同时”执行的

多个进程之间切换,会表现出一定的随机性,即:不会完全相同的先执行 A 进程 x 时长,再执行 B 进程 Y 时长,又回到执行 A 进程 x时长

进程其实是线程的载体,同一个进程中可以存在若干个线程

每开启一个进程,都会默认开启一个线程,并执行该线程,这样的线程一般称之为主线程。在主线程的执行过程中,开发者可以自行创建出新的线程并执行,这些新创建的线程称之为子线程,或工作线程

不管是主线程还是子线程,只是启动方式不同,并没有其他区别

单一的线程执行代码是从上至下,从左至右执行。例如下面的代码

System.out.println("主线程开始");

for (int i = 0; i < 4; i++) {
System.out.println("Main i=" + i);
}

System.out.println("主线程结束");

运行结果:
【达内课程】Thread开启线程_Thread

创建线程方式一:继承 Thread

自定义类,继承​​java.lang.Thread​​​,并重写​​public void run()​​​方法,在需要启动线程时,创建自定义的类对象,并调用​​start()​​方法即可

class CustomThread extends Thread {
@Override
public void run() {
super.run();
for (int i = 0; i < 100; i++) {
System.out.println("CustomThread i=" + i);
}
}
}

Main

public class Main {
public static void main(String[] args) {
System.out.println("主线程开始-----------------");

CustomThread thread = new CustomThread();
thread.start();

for (int i = 0; i < 100; i++) {
System.out.println("Main i=" + i);
}

System.out.println("主线程结束");
}
}

执行结果

主线程开始-----------------
Main i=0
Main i=1
......
Main i=30
Main i=31
CustomThread i=0
Main i=32
......
Main i=41
CustomThread i=1
Main i=42
CustomThread i=2
Main i=43
CustomThread i=3
......
CustomThread i=33
Main i=44
......
Main i=50
CustomThread i=34
......
Main i=98
CustomThread i=82
Main i=99
CustomThread i=83
主线程结束
CustomThread i=84
......
CustomThread i=99

主线程和子线程交替进行,每次执行结果都是不一样的。

我们将代码开启子线程的代码后移:

System.out.println("主线程开始-----------------");

for (int i = 0; i < 100; i++) {
System.out.println("Main i=" + i);
}

CustomThread thread = new CustomThread();
thread.start();

System.out.println("主线程结束");

执行代码会先执行完主线程,然后再执行子线程,其实很好理解,因为代码是从上到下执行的:

主线程开始-----------------
Main i=0
Main i=1
Main i=2
......
Main i=9
主线程结束
CustomThread i=0
CustomThread i=1
CustomThread i=2
......
CustomThread i=9

创建线程方式二:实现Runnable接口

自定义类,实现 ​​java.lang.Runnable​​​,并重写​​public void run()​​​方法,在需要启动线程时,创建自定义的类的对象,并将该对象作为 Thread 的构造方法参数,创建出 Thread 对象,然后调用 Thread 对象的​​start()​​方法

class CustomRunner implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("CustomRunner i=" + i);
}
}
}

启用线程的时候不能再调用​​start()​​​方法了。因为 CustomRunner 是实现的 Runnable 接口,这个接口中并没有这个方法。它直接继承的是​​java.lang.Object​​​,当然 Object 中也没有这个方法。而 CustomThread 的对象之所以能调用​​start​​​方法是因为,它继承的是 Thread,Thread中有​​start​​方法。

正确的开启线程方法是:

CustomRunner runner = new CustomRunner();
Thread r = new Thread(runner);
r.start();