进程
简介:一个正在进行的程序 从内存的角度来看,当程序运行时,系统会为其分配一定的运行空间(运行内存上),这片空间就是进程
线程
线程: 简介:代码的一条执行路径 1,JAVA程序在运行时自带一条线程,这条线程称为主线程(Main线程) 2,一个进程中可以有多个线程,一个进程中有多个线程称为多线程 3,多个线程在抢夺CPU执行权,谁抢夺谁执行一句代码,然后从新抢夺,所以微观考虑他们是交替执行. 因为抢夺CPU执行权的速度很快所以说宏观上是同时执行的
线程与进程的关系:
1,一个进程中可以有多个线程
2,一个进程至少有一个线程,如果一个前台线程都没有,那么该进程执行结束,进程将被销毁
3,进程间不能共享临时数据,多个线程之间可以共享临时数据
4,本质上进程是一个程序的运行空间,线程是代码一条执行路径线程的组成:
1,CPU时间片:抢夺到CPU执行权后,可以执行的时间 (系统为每个线程分配的运行时间)
2,运行数据 堆,多个线程之间共享 堆里面的数据 栈,一个线程拥有独立的栈
3,线程的执行逻辑
进程和线程的关系
一个进程中至少要有一个线程(而且必须是前台线程) 一个进程中可以容纳多个线程, 进程间无法共享数据,线程之间数据可以共享
线程的创建方式
方案一:创建线程对象
方式一:
使用匿名内部类形式创建线程对象
Thread 变量名= new Thread(){ public void run(){ } };
方式二:
创建一个类继承于Thread,重写run 方法
class 子类名 extends Thread{ 重写run方法 } 类名 对象名= new 子类名()
创建Thread的子类对象 步骤: 1,找一个类继承于Thread 2,重写run方法 3,创建该类对象 或 1,创建一个继承与Thread的匿名内部类对象 2,重写run方法
方案二: 方式一:使用Runnable接口
线程的方法
1.线程的启动 :
线程对象.start();
2.线程如何结束:
?----?执行完线程的run方法的代码(run里面的是子线程的)------->线程一经启动不收控制
3.线程的休眠:
线程在休眠时不会抢夺CPU的执行权, 使用:
Thead.sleep(休眠时间单位毫秒);
4.线程的名称 设置线程名称:
方式一:
创建对象时, new Thread( Runnable r, String name)
方式二:
使用线程对象设置线程名称: 线程对象.setName(""); 获取线程名称: 线程对象.getName("");
5.获取当前线程对象 Thread thread=Thread.currentThread();
6.线程的礼让: 释放已经抢夺到的CUP执行权:
public static void yield();
7.线程的合并 将线程A合并到线程B:
public final void join()
A.join()
8.守护线程 --------> 线程启动前必须调用此方法
public final void setDaemon(boolean on)
将此线程标记为daemon线程或用户线程。 当运行的唯一线程都是守护进程线程时,Java虚拟机将退出。
9.线程的优先级别 * 优先级大的线程,要比优先级小的先执行 * 但是还是要符合线程的特点,线程的执行具有随机性
* public final void setPriority(int newPriority) 设置优先级
public final int getPriority():
获取优先级
注:10为最大优先级,1为最低
线程的状态
线程的5个状态 1、新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 2、就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,获取cpu 的使用权,并不是说执行了t.start()此线程立即就会执行 3、运行状态(Running):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。 当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中; 4、阻塞状态(Blocked):处于运行状态中的线程



