复学day11
线程/Thread
所谓的程序是指令和数据的有序集合,其本身并没有任何含义,是一个静态的概念;所谓进程则是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位。
直观上在操作系统中运行的一个程序就是进程,如游戏、QQ等等,一个进程中可以有多个线程,如视频中同时听声音、看图像。(修改:线程在层次上扩展了多任务的概念:一个程序执行多个任务,通常上我们认为一个任务便是一个线程)。
那么多线程和多进程的区别在哪里呢?答:本质的区别在于每个进程拥有自己的一整套变量,而线程则是共享数据。
ps:很多多线程是模拟出来的,真正的多线程是指有多个CPU(多核);所谓的模拟出的多线程指的是在一个cpu的情况下,切换的很快,给人同时执行的错觉(一个时间点,cpu只能执行一个代码)。所以本部分侧重点在于运行顺序逻辑方面,代码语法相对来说少一点。
可能上述描述偏书面化,简单理解就是一个线程就是多一条途径去执行任务,执行任务的顺序不再单调,且加快了执行速度

创建线程
创建线程有三种方式:1、继承Thread类;2、实现Runable接口;3、实现Callable接口(目前阶段接触不多)
关于Thread类实现多线程:
位于java.lang包下,继承Object类、实现Runnable接口
我们在创立线程时,自定义一个线程类继承Thread类,重写run()方法,编写出线程的执行体,继而创建该线程类对象,调用start()方法启动线程。
ps:线程不一定立即执行,cpu安排调度。(该方法已不再推荐,为每个任务单独创建一个线程所付出的代价太大了)
public class Test extends Thread{
@override
public void run(){
//线程体
for(int i = 0; i < 20; i++){
System.out.println("新线程");
}
}
public static void main(String[] args){
//创建线程对象
Test t1 = new Test();
t1.start();
}
}
关于通过Runnable结构实现多线程:
首先定义一个Runnable接口的实现类,同样的定义run()线程体方法,然后创建该类的实例对象,继而创建Thread类,将实例对象作为Thread的参数,通过调用Thread的start()方法启动多线程。
public class Runtest implements Runnable{
@override
public void run(){
//线程方法体
...
}
Runtest test = new Runtest();
new.Thread(p).start();
}
上述两者方法,感觉核心是都是通过覆盖重写run()方法,通过Thread的start()方法执行。不过因为通过继承Thread类来实现多线程是存在单继承的局限性的,所以我们常常选择实现Runnable接口的方式来调用多线程。
警告:不要调用Thread类或Runnable对象的run方法,直接调用run方法只会执行同一个线程中的任务而已,并不会启用新线程,应该调用Thread.start方法。
多线程并发问题
在多线程操作同一资源时便会发生并发问题,后续补充
浙公网安备 33010602011771号