进程:一个正在运行的程序
线程:一个进程中有多个线程,每一个线程就相当于一个执行的任务
特点:程序由上至下依次执行,且一个执行完,才会执行下一个
有点:数据绝对安全
弊端:效率不高
2.线程是如何执行的:
开启一个线程,相当于开启了一个cpu的 执行路径(相对独立的),cpu在执行多个线程时,是随机的,和线程的优先级有关
分时调度:cpu会在多个线程 进行随机切换
3.主线程
多线程的程序 除了主线程以外 一般都叫子线程,一个程序只有一个主线程.
主线程(叫main的线程)是如何执行的?
JVM调用main函数-->cpu就给叫main的函数开辟了执行路径-->相当于在这个执行路径中,执行main函数的代码
Thread线程(开辟一个主线程以外的子线程)
1.创建一个Thread类的子类
2.重写run方法
run方就是你要线程执行的代码
3.调用start方法,开启线程(不能重复开启)
获取当前线程名字的方法
Thread.currentThread().getName()
创建线程类
2.运行状态(start())
3.死亡状态(run方法运行完毕)
4.受阻塞状态(CPU未执行该线程时)
5.休眠状态(sleep方法 休眠时间过了 恢复)
6.等待转态(wait notify)
线程:一个进程中有多个线程,每一个线程就相当于一个执行的任务
一.线程
1.标准的单线程程序特点:程序由上至下依次执行,且一个执行完,才会执行下一个
有点:数据绝对安全
弊端:效率不高
2.线程是如何执行的:
开启一个线程,相当于开启了一个cpu的 执行路径(相对独立的),cpu在执行多个线程时,是随机的,和线程的优先级有关
分时调度:cpu会在多个线程 进行随机切换
3.主线程
多线程的程序 除了主线程以外 一般都叫子线程,一个程序只有一个主线程.
主线程(叫main的线程)是如何执行的?
JVM调用main函数-->cpu就给叫main的函数开辟了执行路径-->相当于在这个执行路径中,执行main函数的代码
Thread线程(开辟一个主线程以外的子线程)
1.创建一个Thread类的子类
2.重写run方法
run方就是你要线程执行的代码
3.调用start方法,开启线程(不能重复开启)
获取当前线程名字的方法
Thread.currentThread().getName()
创建线程类
class MyThread extends Thread{
//定义自己的name属性(尽量避免重名)
private String name;
public MyThread(){
}
//有参构造方法
//1.给父类的name属性赋值
//2.给本类的name属性赋值
public MyThread(String name,String myname){
super(name);
this.name = myname;
}
//父类中使用final修饰的该方法 不能被重写
//可以修改一下方法名,重新提供set/get方法
public void setMyName(String name) {
this.name = name;
}
public String getMyName(){
return this.name;
}
@Override
public void run() {
}
}
线程的创建方式
1.用Thread子类的方法Thread thread = new Thread() {
@Override
public void run() {
System.out.println("子线程执行的方法");
}
};
thread.start();
2.接口实现类的方法 runnable
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("子线程方法");
}
};
Thread thread2 = new Thread(runnable);
thread.start();
3.方式2两步一起写
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("子线程方法");
}
});
二.线程的6种状态
1.新建状态(new thread)2.运行状态(start())
3.死亡状态(run方法运行完毕)
4.受阻塞状态(CPU未执行该线程时)
5.休眠状态(sleep方法 休眠时间过了 恢复)
6.等待转态(wait notify)