三秒钟学会多线程
程序:可以有很多种语言
进程:程序运行起来就变成了进程,进程下面包含线程,资源分配的最小单位(qq,微信...)
每个进程都有独立的代码和数据空间,一个进程可以有多个线程.
线程:CPU调度的最小单位.
run() : 线程的入口,可以定义代码,也可以调用其他方法
start() : 是该线程开始执行,JAVA虚拟机自己调用该线程的run方法.
创建线程的三种方法:
1.创建Thread的子类
创建: 继承 Thread +重写 run()
启动: 创建子类对象 对象.start()
注:run()是属于Thread类的
2.实现Runnable接口(推荐) (面向接口编程,避免单继承局限)
创建: 实现 Runnable接口 +重写 run()方法
启动: 静态代理 Thread
a)、创建真实角色 实现类对象
b)、创建代理角色 Thread 对象+真实角色的引用
c)、代理角色.start
优点:避免了单继承的局限性,可实现资源共享
3.实现callable
优点: 能声明异常,能有返回值 缺点: 编写复杂麻烦
注:start()是属于Thread类的.
线程的生命周期:
1.线程的五种状态:
1)、新生状态: new
2)、就绪状态: runnable
3)、运行状态: running
4)、阻塞状态: blocked
5)、执行完毕: dead
- 阻塞 : sleep
模拟网络延时
- 终止
不要调用 stop destory 方法 , 太暴力,一盆冷水让其停
- 当前线程
Thread.currentThread()
- 优先级
只代表概率,不代表绝对先后(优先级越高,代表优先被CPU调用的概率高)
MIN_PRIORITY : 1
NORM_PRIORITY : 5 默认优先级
MAX_PRIORITY :10
getPriority() setPriority()
二: 同步 : synchronized(同步锁)
- 同步块
- 同步方法
- 死锁
过多的同步容易死锁
- 锁方法
//23张票,卖给3个人,3个人同时购买 资源:23张票,3个人共享 锁方法
public class Web_12306_01 implements Runnable{
int tickets=23;
//程序的入口
public static void main(String[] args) {
Web_12306_01 web=new Web_12306_01();
new Thread(web,"罗杰").start();
new Thread(web,"鹰眼").start();
new Thread(web,"BIG.MUM").start();
}
//线程的入口
public void run() {
while(true){
//A B C在此排队
boolean flag=test();
//循环停止条件 (必须要使循环停止下来)
if(flag==false){
return;
}
}
}
//定义一个方法,方便run()调用
public synchronized boolean test(){
if(tickets<=0){
return false;
}
try {
Thread.sleep(200);//放大问题的可能性,延时200ms
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"买了第"+tickets--+"张票");
return true;
}
}