线程
什么是进程?
- 通过任务管理器我们就可以看到进程的存在
- 进程就是正在运行中的程序,是系统进行资源分配和调用的独立单位,每个进程都有它自己的内存空间和系统资源。
多进程有什么意义?
- 单进程计算机只能做一件事情,而我们现在的计算机都可一边听歌一边玩游戏,所以我们常见的操作系统都是多线程操作系统。Windows、Mac、linux等,能在同一个时间段内执行多个任务。
- 单核计算机,游戏进程和音乐进程是同时运行的吗?
- 不是
- 因为CPU在某个时间点只能做一件事情,就算在游戏进程和音乐进行中做着频繁切换,且切换速度很快,所以,让我们感觉游戏和音乐在同时运行,其实并不是同时执行的。
- 多进程的作用不是提高执行速度,而是提高CPU使用率。
什么是线程?
- 在一个进程的内部又可以执行多个任务,而这每一个任务我们就可以看作是一个线程。线程他是程序中控制流,是程序使用CPU的基本单位。
多线程意义?
- 多线程的作用不是提高执行速度,而是为了提高应用程序使用率。
- 错觉:让我们认为多个线程是并发执行的,并不是
- 因为多个线程共享同一个进程资源(堆内存和方法区),但是栈内存是独立的吗,一个线程一个栈,所以他们任然实在抢CPU的资源执行,一个时间点上只能有一个线程执行,谁抢到谁就执行,不知道谁能抢到,所以造成线程运行的随机性。
什么是并发?
- 并行和并发
- 前者是逻辑上同时发生,指在某一个时间内运行多个程序。
- 后者是物理上同时发生,指在某一个时间点同时运行多个程序。
线程的实现
- 方式一:继承Thread类
- 步骤:
- 自定义类MyThread 继承Thread类
- MyThread重写run方法
- 创建对象
- 启动线程
- 第二种:实现Runnable接口,完成线程创建
public class MyThread extends Thread{
public MyThread(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.getName());
}
public static void main(String[] args) {
MyThread t = new MyThread("线程一");
t.start();
MyThread tt = new MyThread("线程二");
tt.start();
}
}
public class IPLMThread implements Runnable{
private String name;
public IPLMThread(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(this.name);
}
public static void main(String[] args) {
IPLMThread t = new IPLMThread("线程一");
IPLMThread tt = new IPLMThread("线程二");
new Thread(t).start();
new Thread(tt).start();
}
}
线程常用方法
long getId() 返回此线程的标识符。
String getName() 返回此线程的名称。
int getPriority() 返回此线程的优先级。
static int MAX_PRIORITY 线程可以拥有的最大优先级。
static int MIN_PRIORITY 线程可以拥有的最小优先级。
static int NORM_PRIORITY 分配给线程的默认优先级。
Thread.State getState() 返回此线程的状态。
static boolean interrupted() 测试当前线程是否已中断。
boolean isAlive() 测试这个线程是否活着。
boolean isDaemon() 测试这个线程是否是守护线程。
void join() 等待这个线程死亡。 才继续执行下个
void setName(String name) 将此线程的名称更改为等于参数 name 。
void setPriority(int newPriority) 更改此线程的优先级。
static void sleep(long millis) 睡眠(单位毫秒)
void start() 启动线程
static void yield() 放在线程体中操作,暂停当前正在执行的线程对象
(及放弃当前拥有的cup资源)并执行其他线程。让多个
线程的执行更和谐,但是不能靠他保证一人一次。
void setDaemon(boolean on) 将指定线程标记为守护线程或用户线程。
当正在运行的线程都是守护线程时,Java 虚拟机退出。
static Thread currentThread() 返回当前正在执行线程对象
线程生命周期
阻塞
|
新建--->就绪--->运行--->死亡