一、概念相关
1、多线程
(1)多线程:一个应用程序有多条执行路径
进程:正在执行的应用程序
线程:线程依赖于进程存在,一个进程至少有一个线程,
单线程:一个应用只有一条执行路径,
多线程:一个应用程序有多条执行路径
多进程的意义是什么?
提高cpu的使用率,减少CPU的空闲时间
(2)java程序的运行原理以及JVM的驱动是多线程的吗?
A:java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程
B:JVM的启动是多线程的,因为他最低有两个现成启动了,主线程和垃圾回收线程
(3)多线程的实现方案
A:继承Thread类案例:
定义线程类
public class ThreadDemo extends Thread {
public ThreadDemo(){}
public ThreadDemo(String name){
super(name);
}
public void run() {
//在这里写自己的业务代码
for (int i = 0; i <100; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
定义运行类 :
public class MyThread {
public static void main(String[] args) {
ThreadDemo td1 = new ThreadDemo("td1");
ThreadDemo td2 = new ThreadDemo("td2");
td1.start();//运行线程
//td1.setName("td1");//给线程命名
td2.start();
//td2.setName("td2");
}
}
B:实现Runnable接口
步骤:1.自定义MyRunnable类实现Runable接口
2.重写run方法
3.创建MyRunnable类的对象
4、创建Thread类的对象,并把3的对象传递进来
//定义业务类
public class ThreadDemo implements Runnable {
public void run() {
//在这里写自己的业务代码
for (int i = 0; i <100; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
// 运行方式
ThreadDemo td1 = new ThreadDemo();
Thread td = new Thread(td1);
td.setName("xianchegn ");
td.start();
}
(4)线程的调度和优先级问题
A:线程的调度
a:分时调度
b:抢占式调度(java采用的是该调度方式)
B:获取和设置线程优先级
a:默认是5
b:控制范围是1-10
td1.setPriority(1);//设置线程优先级方式
总结:优先权高仅仅表示线程获取CPU时间片的几率高,不是就是说权限高就能一定提前执行,而只是提前执行几率高了
(5)线程的控制(常见方法)
A:休眠线程:暂停当前线程执行
Thread.sleep(整形毫秒数);//1000ms= 1s
B:加入线程:等待join的线程终止(你们都别跑了,等我终止之后再跑)
td1.jion();
C:礼让线程:一定程度上保证线程轮流执行
td1.yield();
D:后台线程:将该线程设置为守护线程或用户线程,当正在运行的线程都是守护线程时,java虚拟机退出,必须在启动 前设定
td1.setDeamon(boolean on); //将td1设置为守护线程(守护xx线程)
E:终止线程
td1.stop();//过时方法,一般不用
td1.interrupt();//终止线程,并抛出异常
(6)线程的生命周期
A:新建
B:就绪,有执行资格,没有执行权
C:运行,有执行资格,有执行权
D:阻塞,没有执行权、执行资格,需要激活
E:死亡,等待垃圾回收
(7)电影院买票程序的实现
A:继承Thread类
B:实现Runnable
(8)解决卖票程序出现的问题
A:为了更符合真实的场景,加入了休眠100毫秒
B:获取和设置线程优先级
a:同票多次贩卖
b:超卖(负票数)
(9)多线程安全问题的原因(判断程序是否有线程安全问题依据)
A:是否有多线程环境
B:是否有共享数据
C:是否有多条语句操作共享数据
(1·0)同步解决线程安全问题
A:同步代码块
synchronizde(锁对象){
需要被同步的代码;
}(这里的锁对象可以是任意对象)
B:同步方法
把同步加在方法上。
锁对象是this
public synchronizde 方法名(锁对象){
需要被同步的代码;
}
C:静态同步方法
把同步加在方法上
锁对象是当前类的字节码文件对象
D:Lock工具类
private Lock lock = new ReentrantLock();
try{
lock.lock();
需要锁定的代码
lock.unlock();
}finally{
lock.unlock();
}
(11)线程安全的类
A:StringBuffer
B:Vector:需要线程安全才使用,但是即使考虑线程安全也不用,用Collections类的方法
C:Hashtable
D:如何把一个线程不安全的类变成一个线程安全的集合类
用Collections工具类的方法
List<String> lsit =Collections.synchronizedList(new ArrayList<String>());
Map<String,String> map =Collections.synchronizedMap(new HashMap<String,String>());
二、相关