多线程
进程线程和线程的概念
进程:
在windows中,每一个打开运行的应用程序或后台程序,比如运行中的QQ、谷歌浏览器、网易云音乐、资源管理器等都是一个进程
我们都知道程序,一个程序是静态的,通常是存放在外存中的。而当程序被调入内存中运行后,就成了进程。
顾名思义,进程就是进行中的程序,它是个动态的概念。是系统进行资源分配与调度的基本单位.
顾名思义,进程就是进行中的程序,它是个动态的概念。是系统进行资源分配与调度的基本单位.
独立性: 进程是系统中独立存在的实体,它可以拥有自己独立的资源,每一个进程都拥有自
己私有的地址空间。在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他
进程的地址空间。
动态性: 进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中
活动的指令集合。在进程中加入了时间的概念。进程具有自己的生命周期和各种不同的状态,
这些概念在程序中都是不具备的。
并发性: 多个进程可以在单个处理器上并发执行,多个进程之间不会互相影响。
己私有的地址空间。在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他
进程的地址空间。
动态性: 进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中
活动的指令集合。在进程中加入了时间的概念。进程具有自己的生命周期和各种不同的状态,
这些概念在程序中都是不具备的。
并发性: 多个进程可以在单个处理器上并发执行,多个进程之间不会互相影响。
线程:线程就是进程中执行运算最小的单位.
继承Threa类创建多线程
1.建类>>继承Thread类>>重写run方法
2.Thread.currentthread().getName(): 获取线程名称
3.start();[启动线程]
注:开启多个线程是交替执行的
4.直接调用run方法
a.只有主线程一条执行路径
b.依次执行两次run方法
案例:
public class MyThread extends Thread { public void run() { for (int i = 0; i < 5; i++) { System.out.println(i + 1+Thread.currentThread().getName()); } } }
启动线程:
public static void main(String[] args) { // TODO Auto-generated method stub MyThread t1 = new MyThread(); t1.start(); }
结果:
实现Runnable接口创建多线程
a.定义一个Runnable接口的实现类 (类名 implems Runnable)
b.重写Run方法
c.创建线程对象Runnable 类名 =new Runnable ();
Thread 对象名称=new Therad(类名,"线程名称");
d.启动线程 start();
e.继承Therad类和实现Runnable接口的区别
继承:编写简单缺点继承的单根性
接口:避免单继承,便于资源共享
推荐使用实现Runnable接口
案例:
public class MyRunnable implements Runnable { @Override public void run() { System.out.println("我是接口实现多线程"); } }
启动线程:
public static void main(String[] args) { MyRunnable mr = new MyRunnable(); Thread t2 = new Thread(mr); t2.start(); }
Thread类的常用方法
部分方法的演示
线程的五种状态
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线
程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked) 和死
亡(Dead) 五种状态。尤其是当线程启动以后,它不能一直“霸占”着CPU 独自运行,所以CPU 需
在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。
如图:
程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked) 和死
亡(Dead) 五种状态。尤其是当线程启动以后,它不能一直“霸占”着CPU 独自运行,所以CPU 需
在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。
如图: