多线程概述

线程的创建和启动

1.1 继承 Thread 类创建线程

步骤如下:

  • 定义 Thread 的子类,并重写该类的 run() 方法.该方法表示线程需要完成的任务,因此 run() 方法被称为线程执行体
  • 创建 Thread 子类的实例,即创建了线程对象
  • 调用线程对象的 start() 方法启动该线程

FirstThread.java(继承 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
package Threads;/*
* @Author Sheng WenZeng
* @Date 2019/9/7 17:51
* @Version 1.0
*/

/**
* @author Sheng Wenzeng
* @ClassName FirstThread
* @Description TODO
* @Date 2019/9/7 17:51
* @Version 1.0
*/
public class FirstThread extends Thread {
private int i;

public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 20) {
new FirstThread().start();
new FirstThread().start();
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}

@Override
public void run() {
for (; i < 100; i++) {
// 当线程类继承 Thread 时,直接使用 this 可以获取当前线程
// Thread 对象的 getName() 方法可以获得当前线程的名字
System.out.println(this.getName() + " " + i);
}
}
}

运行结果:

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
............
main 74
main 75
main 76
main 77
main 78
main 79
main 80
main 81
main 82
main 83
main 84
main 85
main 86
main 87
main 88
main 89
main 90
main 91
main 92
main 93
main 94
main 95
main 96
main 97
main 98
main 99
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9
Thread-0 10
Thread-0 11
Thread-0 12
Thread-0 13
Thread-0 14
Thread-0 15
Thread-0 16
Thread-0 17
Thread-0 18
Thread-0 19
Thread-0 20
Thread-0 21
Thread-0 22
Thread-0 23
Thread-1 0
Thread-0 24
Thread-1 1
Thread-0 25
Thread-0 26
Thread-0 27
Thread-0 28
Thread-0 29
Thread-0 30
Thread-0 31
Thread-0 32
Thread-0 33
Thread-0 34
Thread-0 35
Thread-0 36
Thread-0 37
Thread-0 38
Thread-0 39
Thread-0 40
Thread-0 41
Thread-0 42
Thread-0 43
Thread-0 44
Thread-0 45
Thread-0 46
Thread-0 47
Thread-0 48
Thread-0 49
Thread-0 50
Thread-0 51
Thread-0 52
Thread-0 53
Thread-0 54
Thread-0 55
Thread-0 56
Thread-0 57
Thread-0 58
Thread-0 59
Thread-0 60
Thread-0 61
Thread-0 62
Thread-0 63
Thread-0 64
Thread-0 65
Thread-0 66
Thread-1 2
Thread-1 3
Thread-1 4
Thread-1 5
Thread-1 6
Thread-1 7
Thread-1 8
Thread-1 9
Thread-1 10
Thread-1 11
.........

Main类中的main方法就是一个线程,然后调用了另外两个线程,这两个线程的实例不能共享

1.2 实现 Runable 接口创建线程类

SecondThread.java(实现 Runable接口)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package Threads;/*
* @Author Sheng WenZeng
* @Date 2019/9/7 18:09
* @Version 1.0
*/

/**
* @author Sheng Wenzeng
* @ClassName SecondThread
* @Description TODO
* @Date 2019/9/7 18:09
* @Version 1.0
*/
public class SecondThread implements Runnable {

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

Main.java

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
package Threads;/*
* @Author Sheng WenZeng
* @Date 2019/9/7 18:09
* @Version 1.0
*/

/**
* @author Sheng Wenzeng
* @ClassName SecondThread
* @Description TODO
* @Date 2019/9/7 18:09
* @Version 1.0
*/
public class SecondThread implements Runnable {
private int i;

public static void main(String[] args) {
for (int i = 0; i < 200; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 20) {
SecondThread st = new SecondThread();
new Thread(st, "线程一").start();
new Thread(st, "线程二").start();
}
}
}

@Override
public void run() {
for (; i < 200; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}

运行结果:

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
main  0
main 1
main 2
main 3
main 4
main 5
main 6
main 7
main 8
main 9
main 10
main 11
main 12
main 13
main 14
main 15
main 16


.......................


线程一 38
线程一 39
线程一 40
线程一 41
线程一 42
线程一 43
线程一 44
线程一 45
线程一 46
线程一 47
线程一 48
线程一 49
线程一 50
线程一 51
线程一 52
线程一 53
线程一 54
线程一 55
线程二 55
线程二 56
线程二 57
线程二 58
线程二 59
线程二 60
线程二 61
线程二 62
线程二 63
线程二 64
线程二 65
线程二 66
..............

使用 Runable 接口的线程之间可以共享实例变量

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×