文章目录
进程和线程
进程就是某个应用程序从还没开始运行,到运行结束的整个过程
可以存在多个进程,但多个进程的执行,其实是高频率的切换,并不是真正意义上的“同时”执行的
多个进程之间切换,会表现出一定的随机性,即:不会完全相同的先执行 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
自定义类,继承java.lang.Thread
,并重写public void run()
方法,在需要启动线程时,创建自定义的类对象,并调用start()
方法即可
class CustomThread extends Thread {
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 {
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();