1线程相关:
1)进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。如图这是window系统应用程序
2)线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程
程序运行原理:
- 分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
2.抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度
对于CPU的一个核而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是在同一时刻运行。
其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。
3)多线程:一个程序有多个线程在执行
————*线程————
—*主线程:
jvm启动后,必然有一个执行路径(线程)从main方法开始的,一直执行到main方法结束,
这个线程在java中称之为主线程(main线程)
——*线程类:Thread
**线程运行原理:
1)分时调度
2)抢占式调度(java使用的是抢占式调度)
1.包:
java.lang.Thread
2.方法:
1)String getName() 返回该线程名称
2) void setName(String name) 设置线程名称
3)static Thread currentThread() 返回当前线程对象
4)static void sleep(long millis) 休眠 睡眠 参数为毫秒
3.开启线程的方式:
1)第一种开启线程的方式:
*1.定义一个类继承Thread类
*2.重写Thread类的run方法(线程任务 想在线程中执行代码)
*3.创建子类对象
*4.调用继承过来的start方法
2)第二种开启线程的方式:(java.lang.Runnable)
*1.定义一个类实现Runnable接口
* 2.重写run方法(线程任务)
* 3.开启线程
创建Thread类对象
Thread(Runnable r)
参数Runnable接口 可以传入其实现类对象
Thread t= new Thread(Runnable的实现类对象);
t.start()
4.匿名内部类使用线程:
作用:定义一个类的子类对象快捷方法
new 父类/接口(){
重写方法
}
5.解决线程不安全:
1)使用同步:
*线程的同步原理:
有锁的线程先执行,
没锁的线程等待
同步代码块
* 1 synchronized(任意对象){
可能出现问题的代码
}
*2 同步方法 :synchronized method();
在方法的声明上加上关键字synchronized
同步方法有锁吗? 有 锁是谁? this
同步方法可以是静态的吗? 可以
静态的同步方法的锁对象还是this吗? 不是
是谁?类名.class
2)使用Lock锁:
*1.(java.util.concurrent.locks.Lock 接口)
实现类ReentrantLock:
Lock l = new ReentrantLock();
*2.方法:
void lock() 获取锁
void unlock() 释放锁
***线程状态图