线程的基本认识
什么是进程?
每一个应用程序就是进程,windows系统下 Ctrl+Alt+Del 调出任务管理器,看到进程列表,可以详细的看到开启了哪些进程。
用户每启动一个进程,操作系统就会为该进程分配一个独立的内存空间。
什么是线程?
线程存在于进程之中,一个进程包含一个或多个线程。例如迅雷与百度云盘的下载任务,可以同时下载多个文件,而每一个下载任务就是一个线程。线程之间可以并发(肉眼可见的同时执行)执行。而下载任务的线程又依赖于进程,如果你把软件进程杀死,那么线程就会停止下载任务。
疑惑点:并发是同一时刻的同时进行么?
单核cpu的是永远不会同一时刻执行两个任务的。只是我们肉眼可见的觉着同时再进行。而多核CPU就可以做到同时执行多个任务,毕竟是cpu在工作。
疑惑点:既然每一时刻只能执行一个任务,那么多线程如何提高程序的效率呢?
假如你同时运行着网易云听歌,百度云下载10文件。那么cpu再每一个时间点都会有一个线程再被执行。而执行网易云听歌与下载任务的分配就是 1:10,虽然cpu在同一时刻只能做一件事情,但是你百度云的竞争者线程多啊,那么你下载的效率就会提高!
线程的创建
一、继承 extends Thread
class CreateThread extends Thread {
// run方法中编写 多线程需要执行的代码
publicvoid run() {
for (inti = 0; i< 10; i++) {
System.out.println("i:" + i);
}
}
}
publicclass ThreadDemo {
publicstaticvoid main(String[] args) {
System.out.println("-----多线程创建开始-----");
// 1.创建一个线程
CreateThread createThread = new CreateThread();
// 2.开始执行线程 注意 开启线程不是调用run方法,而是start方法
System.out.println("-----多线程创建启动-----");
createThread.start();
System.out.println("-----多线程创建结束-----");
}
}
二、实现接口 implements Runnable
class CreateRunnable implements Runnable {
@Override
publicvoid run() {
for (inti = 0; i< 10; i++) {
System.out.println("i:" + i);
}
}
publicclass ThreadDemo2 {
publicstaticvoid main(String[] args) {
System.out.println("-----多线程创建开始-----");
// 1.创建一个线程
CreateRunnable createThread = new CreateRunnable();
// 2.开始执行线程 注意 开启线程不是调用run方法,而是start方法
System.out.println("-----多线程创建启动-----");
Thread thread = new Thread(createThread);
thread.start();
System.out.println("-----多线程创建结束-----");
}
}
疑惑点:为什么是调用star()而不是run()呢?
start():start()用来启动一个线程,当调用start()方法时,系统才会开启一个子线程,通过Thead类中start()方法来启动的线程处于就绪状态(可运行状态),此时并没有运行,而是和其他线程一起竞争cpu的执行权,一旦得到CPU时间片,就自动开始执行run()方法。
run():run()方法只是处理子线程业务逻辑代码的存放地。如果在主线程中直接调用,就和调用一个普通的方法没有什么区别。并且还要等待run方法运行结束才能继续执行下面代码。那么多线程将变得毫无意义。
线程的五种状态
新建状态(new):使用new关键字将线程的实体类穿件出来
就绪状态(Runnable):调用方法start,线程进入等待执行状态
运行状态(Running):获取到CPU的执行权,正在运行重写的run方法
阻塞状态(Blocked):当前线程让出CPU的执行权,例如调用sleep方法,使其处于休眠状态
死亡状态(Dead):线程正常运行结束,或者异常终止
遗留问题?
run方法是void,如何再线程结束返回一个结果呢?
future模式了解一下。