目录
线程与进程的区别
每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。
使用线程可以把占据时间长的程序中的任务放到后台去处理,程序的运行速度可能加快,在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵资源如内存占用等等。
如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换,更多的线程需要更多的内存空间,线程的中止需要考虑其对程序运行的影响。通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
总结:进程是所有线程的集合,每一个线程是进程中的一条执行路径
为什么要使用多线程
思考生活问题
现在有一吨,也就是有1000千克的水,目前只有小明一个人去打水,但是小明每小时只能打水200千克,现在要求一小时内把水全部打完,请问怎么解决?
如果小明一个人将水全部打完需要五小时!
解决办法:
再加四个人同时打水,五个人每小时打水200千克,那么一小时后就可以完成一吨水!
总结:多线程的好处是提高程序效率
多线程应用场景
答:主要能体现到多线程提高程序效率。
举例:迅雷多线程下载、分批发送短信等。
多线程创建方式
第一种继承Thread类 重写run方法
/**
* @author Oh_MyBug
* @date 2020/2/23
*/
class CreateThread extends Thread {
/**
* run方法执行 需要线程执行的任务、代码
*/
public void run() {
for (int i = 0; i < 100; i ++){
System.out.println("run() i:" + i);
}
}
}
/**
* @author Oh_MyBug
* @date 2020/2/23
*/
public class ThreadDemo {
public static void main(String[] args) {
System.out.println("创建线程开始 main");
// 1.定义一个类,继承Thread类 重写run方法
// 2.如何启动线程?
CreateThread createThread = new CreateThread();
// 启动一个线程 是调用start方法 不是run方法,调用run方法相当于主线程执行
// 注意 使用多线程情况,代码不会重写往下进行执行,会同时并行执行
createThread.start();
System.out.println("线程已经开始启动 main");
for (int i = 0; i < 100; i ++){
System.out.println("main() i:" + i);
}
}
}
Output
创建线程开始 main
线程已经开始启动 main
main() i:0
run() i:0
run() i:1
run() i:2
run() i:3
run() i:4
run() i:5
main() i:1
run() i:6
main() i:2
run() i:7
main() i:3
run() i:8
main() i:4
run() i:9
main() i:5
run() i:10
main() i:6
run() i:11
main() i:7
run() i:12
main() i:8
run() i:13
run() i:14
run() i:15
main() i:9
run() i:16
main() i:10
run() i:17
main() i:11
run() i:18
main() i:12
main() i:13
main() i:14
main() i:15
run() i:19
main() i:16
run() i:20
main() i:17
run() i:21
main() i:18
main() i:19
main() i:20
main() i:21
main() i:22
main() i:23
main() i:24
main() i:25
main() i:26
main() i:27
main() i:28
run() i:22
main() i:29
run() i:23
main() i:30
main() i:31
run() i:24
run() i:25
run() i:26
run() i:27
run() i:28
run() i:29
run() i:30
run() i:31
run() i:32
run() i:33
run() i:34
run() i:35
run() i:36
run() i:37
run() i:38
run() i:39
run() i:40
run() i:41
run() i:42
run() i:43
run() i:44
run() i:45
run() i:46
run() i:47
run() i:48
run() i:49
run() i:50
run() i:51
run() i:52
run() i:53
run() i:54
run() i:55
run() i:56
run() i:57
run() i:58
run() i:59
run() i:60
run() i:61
run() i:62
run() i:63
run() i:64
run() i:65
run() i:66
run() i:67
run() i:68
run() i:69
run() i:70
run() i:71
run() i:72
run() i:73
run() i:74
run() i:75
run() i:76
run() i:77
run() i:78
run() i:79
run() i:80
run() i:81
run() i:82
run() i:83
run() i:84
run() i:85
run() i:86
run() i:87
run() i:88
run() i:89
run() i:90
run() i:91
run() i:92
run() i:93
run() i:94
run() i:95
run() i:96
run() i:97
run() i:98
run() i:99
main() i:32
main() i:33
main() i:34
main() i:35
main() i:36
main() i:37
main() i:38
main() i:39
main() i:40
main() i:41
main() i:42
main() i:43
main() i:44
main() i:45
main() i:46
main() i:47
main() i:48
main() i:49
main() i:50
main() i:51
main() i:52
main() i:53
main() i:54
main() i:55
main() i:56
main() i:57
main() i:58
main() i:59
main() i:60
main() i:61
main() i:62
main() i:63
main() i:64
main() i:65
main() i:66
main() i:67
main() i:68
main() i:69
main() i:70
main() i:71
main() i:72
main() i:73
main() i:74
main() i:75
main() i:76
main() i:77
main() i:78
main() i:79
main() i:80
main() i:81
main() i:82
main() i:83
main() i:84
main() i:85
main() i:86
main() i:87
main() i:88
main() i:89
main() i:90
main() i:91
main() i:92
main() i:93
main() i:94
main() i:95
main() i:96
main() i:97
main() i:98
main() i:99
第二种实现Runnable接口,重写run方法
/**
* @author Oh_MyBug
* @date 2020/2/23
*/
class CreateRunnable implements Runnable {
/**
* run方法执行 需要线程执行的任务、代码
*/
@Override
public void run() {
for (int i = 0; i < 100; i ++){
System.out.println("run() i:" + i);
}
}
}
public class ThreadDemo2 {
public static void main(String[] args) {
// 第一个类,实现Runnable接口 重写run方法
System.out.println("创建线程开始 main");
CreateRunnable createRunnable = new CreateRunnable();
Thread thread = new Thread(createRunnable);
thread.start();
System.out.println("线程已经启动 main");
for (int i = 0; i < 100; i ++){
System.out.println("main() i:" + i);
}
}
}
Output
创建线程开始 main
线程已经启动 main
main() i:0
main() i:1
main() i:2
main() i:3
run() i:0
run() i:1
run() i:2
run() i:3
run() i:4
run() i:5
run() i:6
run() i:7
run() i:8
run() i:9
run() i:10
run() i:11
run() i:12
run() i:13
run() i:14
run() i:15
run() i:16
run() i:17
run() i:18
run() i:19
run() i:20
run() i:21
run() i:22
run() i:23
run() i:24
run() i:25
run() i:26
run() i:27
run() i:28
run() i:29
run() i:30
run() i:31
run() i:32
run() i:33
run() i:34
run() i:35
run() i:36
run() i:37
run() i:38
run() i:39
run() i:40
run() i:41
run() i:42
run() i:43
run() i:44
run() i:45
run() i:46
run() i:47
main() i:4
run() i:48
run() i:49
run() i:50
run() i:51
run() i:52
run() i:53
run() i:54
run() i:55
run() i:56
run() i:57
run() i:58
run() i:59
run() i:60
run() i:61
run() i:62
run() i:63
run() i:64
run() i:65
run() i:66
run() i:67
run() i:68
main() i:5
run() i:69
run() i:70
main() i:6
run() i:71
run() i:72
run() i:73
run() i:74
run() i:75
run() i:76
run() i:77
run() i:78
run() i:79
main() i:7
run() i:80
main() i:8
run() i:81
main() i:9
run() i:82
main() i:10
run() i:83
main() i:11
run() i:84
main() i:12
run() i:85
run() i:86
run() i:87
run() i:88
run() i:89
run() i:90
run() i:91
run() i:92
main() i:13
run() i:93
main() i:14
run() i:94
main() i:15
run() i:95
run() i:96
run() i:97
run() i:98
run() i:99
main() i:16
main() i:17
main() i:18
main() i:19
main() i:20
main() i:21
main() i:22
main() i:23
main() i:24
main() i:25
main() i:26
main() i:27
main() i:28
main() i:29
main() i:30
main() i:31
main() i:32
main() i:33
main() i:34
main() i:35
main() i:36
main() i:37
main() i:38
main() i:39
main() i:40
main() i:41
main() i:42
main() i:43
main() i:44
main() i:45
main() i:46
main() i:47
main() i:48
main() i:49
main() i:50
main() i:51
main() i:52
main() i:53
main() i:54
main() i:55
main() i:56
main() i:57
main() i:58
main() i:59
main() i:60
main() i:61
main() i:62
main() i:63
main() i:64
main() i:65
main() i:66
main() i:67
main() i:68
main() i:69
main() i:70
main() i:71
main() i:72
main() i:73
main() i:74
main() i:75
main() i:76
main() i:77
main() i:78
main() i:79
main() i:80
main() i:81
main() i:82
main() i:83
main() i:84
main() i:85
main() i:86
main() i:87
main() i:88
main() i:89
main() i:90
main() i:91
main() i:92
main() i:93
main() i:94
main() i:95
main() i:96
main() i:97
main() i:98
main() i:99
第三种使用匿名内部类方式
/**
* ClassName: ThreadDemo3
* Function: TODO
* Date: 2020/2/23 4:44
* author: Oh_MyBug
* version: V1.0
*/
/**
* ClassName: ThreadDemo3
* Date: 2020/2/23 4:44
* author: Oh_MyBug
* version: V1.0
*/
public class ThreadDemo3 {
public static void main(String[] args) {
System.out.println("创建线程成功!");
// 使用匿名内部类方式创建线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i ++){
System.out.println("run() i:" + i);
}
}
});
System.out.println("创建线程结束");
thread.start();
for (int i = 0; i < 100; i ++){
System.out.println("main() i:" + i);
}
}
}
Output
创建线程成功!
创建线程结束
main() i:0
main() i:1
main() i:2
main() i:3
main() i:4
run() i:0
run() i:1
run() i:2
run() i:3
run() i:4
run() i:5
run() i:6
run() i:7
run() i:8
run() i:9
run() i:10
run() i:11
run() i:12
run() i:13
run() i:14
run() i:15
main() i:5
run() i:16
run() i:17
run() i:18
run() i:19
run() i:20
run() i:21
run() i:22
main() i:6
run() i:23
run() i:24
run() i:25
main() i:7
run() i:26
main() i:8
run() i:27
main() i:9
run() i:28
main() i:10
run() i:29
main() i:11
run() i:30
main() i:12
run() i:31
main() i:13
run() i:32
main() i:14
run() i:33
main() i:15
run() i:34
main() i:16
run() i:35
main() i:17
run() i:36
run() i:37
run() i:38
run() i:39
run() i:40
run() i:41
run() i:42
run() i:43
run() i:44
run() i:45
run() i:46
run() i:47
run() i:48
run() i:49
run() i:50
run() i:51
run() i:52
run() i:53
run() i:54
run() i:55
run() i:56
run() i:57
main() i:18
main() i:19
main() i:20
main() i:21
main() i:22
main() i:23
main() i:24
main() i:25
main() i:26
main() i:27
main() i:28
main() i:29
main() i:30
main() i:31
main() i:32
main() i:33
main() i:34
main() i:35
main() i:36
main() i:37
main() i:38
main() i:39
main() i:40
main() i:41
main() i:42
main() i:43
run() i:58
main() i:44
run() i:59
main() i:45
run() i:60
main() i:46
run() i:61
run() i:62
main() i:47
run() i:63
run() i:64
run() i:65
run() i:66
run() i:67
run() i:68
run() i:69
run() i:70
run() i:71
run() i:72
run() i:73
run() i:74
run() i:75
run() i:76
run() i:77
run() i:78
run() i:79
run() i:80
run() i:81
run() i:82
run() i:83
run() i:84
run() i:85
run() i:86
run() i:87
run() i:88
run() i:89
run() i:90
run() i:91
run() i:92
run() i:93
run() i:94
run() i:95
run() i:96
run() i:97
run() i:98
run() i:99
main() i:48
main() i:49
main() i:50
main() i:51
main() i:52
main() i:53
main() i:54
main() i:55
main() i:56
main() i:57
main() i:58
main() i:59
main() i:60
main() i:61
main() i:62
main() i:63
main() i:64
main() i:65
main() i:66
main() i:67
main() i:68
main() i:69
main() i:70
main() i:71
main() i:72
main() i:73
main() i:74
main() i:75
main() i:76
main() i:77
main() i:78
main() i:79
main() i:80
main() i:81
main() i:82
main() i:83
main() i:84
main() i:85
main() i:86
main() i:87
main() i:88
main() i:89
main() i:90
main() i:91
main() i:92
main() i:93
main() i:94
main() i:95
main() i:96
main() i:97
main() i:98
main() i:99
使用继承Thread类还是使用实现Runnable接口好?
答:使用实现Runnable接口好,原因实现了接口还可以继续继承,继承了类不能再继承。
启动线程是使用调用start方法还是run方法?
开始执行线程 注意 开启线程不是调用run方法,而是start方法。
调用run只是使用实例调用方法。
获取线程对象以及名称
常用API方法 | 作用 |
---|---|
start() | 启动线程 |
currentThread | 获取当前线程对象 |
getID() | 获取当前线程对象 |
getName() | 获取当前线程名称 |
sleep(long mill) | 休眠线程 |
Stop() | 停止线程 |
常用线程构造函数 | 作用 |
---|---|
Thread() | 分配一个新的Thread对象 |
Thread(String name) | 分配一个新的Thread对象,具有指定的name 正如其名 |
Thread(Runnable r) | 分配一个新的Thread对象 |
Thread(Runnable r,String name) | 分配一个新的Thread对象 |
sleep方法
/**
* @Class: TODO
* @author: Oh_MyBug
* @Date: 2020/2/23 5:07
*/
class DemoThread extends Thread {
// 在run方法中不能抛出异常,只能try
@Override
public void run() {
for (int i = 0; i < 10; i++) {
// sleep 是毫秒
try {
// sleep作用让当前线程从运行状态变为休眠状态,如果时间到期,再次变为运行状态
// sleep不能释放锁,wait可以释放锁
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("i:"+i);
}
}
}
/**
* ClassName: ThreadDemo4
* Date: 2020/2/23 5:06
* author: Oh_MyBug
* version: V1.0
*/
public class ThreadDemo4 {
public static void main(String[] args) {
new DemoThread().start();
}
}
Output
i:0
i:1
i:2
i:3
i:4
i:5
i:6
i:7
i:8
i:9