一、并发与并行
并发:两个或多个事件在同一时间段内发生;
并行:两个或多个事件在同一时刻发生。

二、线程与进程
进程:内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序既是一个进程从创建、运行到消亡的过程。
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
线程调度:
分时调度:所有线程轮流使用CPU,平均分配每个线程占用CPU的时间;
抢占式调度:优先让优先级高的线程使用CPU,优先级相同的会随机选择一个(线程随机性),Java使用的是抢占式调度。
主线程:执行主(main)方法的线程
单线程程序:程序中只有一个线程,从main方法开始从上到下依次执行。
1.jvm执行main方法,main方法进入栈内存;
2.Jvm找操作系统开辟一条main方法通向CPU的执行路径,CPU就可以通过之歌路径执行main方法;
3.这个路径叫为主(main)线程。

三、创建线程类
Java使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。
创建并启动多线程的步骤如下:
(方法一)
1.定义Thread类的子类,并重写该类的run()方法(线程的执行体)。
2.创建Thread子类的实例,即线程对象;
3.调用线程对象的start()方法启动线程。
(方法二)
1.定义Runnable接口的实现类,并重写该接口的run()方法。
2.创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread线程对象。
3.调用线程对象的start()方法启动线程。
Thread 和Runnable的区别:如果继承Thread,不适合资源共享,但是Runnable接口很容易实现资源共享。可以继承其他类,增强了扩展性。降低了耦合性。
匿名内部类方式创建线程
格式:
new Thread(new Runnable(){
@override
public void run(){
//执行内容...
}
}).start();
注意start()方法和run()方法区别:run()方法只是加入原来的栈,还是原来的线程;start()方法每次都开辟一个新的栈并调用run()方法,实现多线程。
附:线程运行内存图如下:

为下一篇线程安全做准备!
网友评论