Java使用Thread类代表线程,所有的线程对象都必须是Thread类或者其子类的实例。每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码)。Java使用线程执行体来代表这段程序流。


继承Thread类创建线程类

通过继承Thread类来创建并启动多线程的步骤如下:

  • 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务。因此把run()方法称为线程执行体。
  • 创建Thread子类的实例,即创建了线程对象。
  • 调用线程对象的start()方法来启动该线程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
//返回当前线程的名字
System.out.println(Thread.currentThread().getName() + " " + i);
}
}

public static void main(String[] args) {
for (int i = 1; i <= 6; i++) {
//获取当前线程的名字
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 3) {
//创建第一个线程
MyThread thread1 = new MyThread();
//启动第一个线程
thread1.start();

//创建第二个线程
MyThread thread2 = new MyThread();
//启动第二个线程
thread2.start();
}
}
}
}

/*
//输出结果:
main 1
main 2
main 3
main 4
main 5
main 6
Thread-1 1
Thread-0 1
Thread-1 2
Thread-0 2
Thread-1 3
Thread-0 3
Thread-1 4
Thread-0 4
Thread-1 5
Thread-0 5
*/

//或者

/*
//输出结果:
main 1
main 2
main 3
main 4
main 5
main 6
Thread-0 1
Thread-1 1
Thread-0 2
Thread-1 2
Thread-0 3
Thread-1 3
Thread-0 4
Thread-1 4
Thread-0 5
Thread-1 5
*/

其中,第一个线程和第二个线程的执行顺序,每次运行先后顺序可能不一定相同,得根据虚拟机的线程调度器的调度。

实现Runnable接口创建线程类

实现Runnable接口来创建并启动多线程的步骤如下:

  • 定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
  • 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public class MyThread implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
//返回当前线程的名字
System.out.println(Thread.currentThread().getName() + " " + i);
}
}

public static void main(String[] args) {
for (int i = 1; i <= 6; i++) {
//获取当前线程的名字
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 3) {
//创建Runnable的实例:MyThread
MyThread myThread = new MyThread();

//创建第一个线程,并将Runnable的实例:MyThread,作为Thread的target来创建Thread对象
Thread thread1 = new Thread(myThread, "第一个线程");
//启动第一个线程
thread1.start();

//创建第二个线程
Thread thread2 = new Thread(myThread, "第二个线程");
//启动第二个线程
thread2.start();
}
}
}
}

/*
//输出结果:
main 1
main 2
main 3
main 4
main 5
main 6
第一个线程 1
第二个线程 1
第一个线程 2
第二个线程 2
第一个线程 3
第二个线程 3
第一个线程 4
第二个线程 4
第一个线程 5
第二个线程 5
*/

//或者

/*
//输出结果:
main 1
main 2
main 3
main 4
main 5
main 6
第二个线程 1
第一个线程 1
第二个线程 2
第一个线程 2
第二个线程 3
第一个线程 3
第二个线程 4
第一个线程 4
第二个线程 5
第一个线程 5
*/
其中,第一个线程和第二个线程的执行顺序,每次运行先后顺序可能不一定相同,得根据虚拟机的线程调度器的调度。