程序
存在磁盘中的引用
进程
运行在内存中的程序
线程
概念
轻量级的进程
同一进程下,可有许多的线程,这些线程共享堆内存和方法区
同一进程下,不同线程有不同的栈内存和程序计数器
作用
提高进程的执行效率
线程安全
synchronized 锁机制
锁对象
锁方法
锁代码块 双重锁检查
加锁效率低
线程安全类
优先级
整数1~10 默认为5
优先级高的未必比优先级低的执行快,只是执行的概率更大,就可能更快
如何设置 setPriority()
new Thread().setPriority(9)
生命周期
新建 使用new,Thread或其子类创建完对象后
运行
就绪(Ready) 线程对象执行start()后 会等待cpu分配资源 不确定性,
运行中 start()后得到cpu资源后在运行状态 或 执行run()
注意start()方法能真正实现多线程而 run()不是,执行run()以后程序仍然只有一个主线程。
等待
期限等待
不会被cpu分配时间,也无需其他程序显示的唤醒,一定时间后由系统自动唤醒,
Threan.sleep()
设置Timeout参数的Object.wait()
设置Timeout参数的Thread.join()
LockSuport.parkNanos()方法
LockSuport.parkUntil()方法
无期限等待
未设置Timeout参数的Object.wait()
未设置Timeout参数的Thread.join()
LockSuport.parkl()方法
阻塞
wait(),sleep()睡眠,suspend()挂起,等等某个锁对象,失去资源占用后 处于
结束
执行完run()方法 或stop()和destroy()强制终止
多线程
继承Thread
run() 欲实现多线程的部分
实现Runnable
run() 欲实现多线程的部分
属性Lock. Lock是Java实现并发编程的框架类
Lock lock = new ReentrantLock()
并行
程序真正同时运行
并发
程序表面同时运行,实际上是执行一会这个程序,没执行完又去执行其他程序了,同一时刻只运行着一个程序
附上两个多线程的简单代码实现
三大特性
原子性
由Java内存模型来直接保证原子性变量操作,如read,load,assign,use,store,write
基本数据类型具备原子性(long和duoble 除外)
若需要更大的原子性支持可使用Lock和synchronized关键字
可见性
可见性与JVM内存模型有关,非可见性的变量需线程通过主内存来Save和Load。可见性并不能保证线程安全
有序性
不保证有序性指JVM存在机器级(编译时、汇编语言级)的指令优化,但当多个线程对同一个变量的状态依赖时就不能保证符合逻辑
补充 volatile关键字的说明见博客https://blog.csdn.net/weixin_42231373/article/details/84643771
单例实体类
public class Singletion {
private static volatile Singletion st;
private Singletion() {
}
public static Singletion getInstance() {
if (st == null) {
synchronized (Singletion.class) {
if (st == null) { //双重锁检查,只在第一次new的时候性能低
st = new Singletion();
}
}
}
return st;
}
}
实现runnable接口
public class MyRunnable implements Runnable {
@Override
public void run() {
//run方法中写的就是欲实现多线程的部分
Singletion st= Singletion.getInstance();
System.out.println(st);
}
}
继承Thread类
public class MyThread extends Thread {
@Override
public void run() {
//run方法中写的就是欲实现多线程的部分
Singletion st= Singletion.getInstance();
System.out.println(st);
}
}
测试类
public class Test {
// 多线程实现方式二,常用
public static void test() {
for (int i = 0; i < 10; i++) {
Thread t = new Thread(new MyRunnable());
t.start();//
}
}
// 多线程实现方式一,基本没人用了
public static void test2() {
Thread t = new MyThread();
// t.run();// 一定不要写,写了实现不了多线程
for (int i = 0; i < 10; i++) {
t.start();//
}
}
public static void main(String[] args) {
test();
}
}