sleep(time)必须指定睡眠时间 单位是毫秒到点自动唤醒
CPU的执行资格:可以被cpu处理 在处理队列中排队
CPU的执行权:正在被CPU处理
一个特殊的状态 :就绪(临时阻塞) 具备了执行的资格但是还没有获取资源(执行权)
创建线程的第一种方式:继承Thread类 cpu快速切换 导致线程切换
Thread 中有封装线程任务的方法
将自己的方法放在子类的run()中
创建线程的第二种方式:实现Runnable接口
1、定义类实现Runnable接口
2、覆盖接口中的run方法 将线程的任务代码封装到run方法中
3、通过Thread类创建线程对象,并将Runnable接口的子类对象作为构造函数的参数进行传递
因为线程的任务都封装在Runnable接口子类对象的run方法中 所以要在线程对象创建时就必须明确要运行的任务
4、调用线程对象的start方法开启线程
实现Runnable 接口的好处(区别):
1、将线程的任务从线程的子类中分离出来,进行了单独的封装
按照面向对象的思想将任务封装成对象
2、避免了java单继承的局限性
所以创建线程的第二种方式较为常见
子类已经继承了一个fu 可以用接口来扩展功能 让其中的内容作为线程的任务执行
因为不是Thread的儿子
所以要通过
Demo d = new Demo();
Thread t1 = new Thread (d);
Thread
对象
private Runnable r;
Thread(){}
Thread(Runnable r){
this.r=r;
}
public void run(){ //继承的时候该方法被 覆盖 接口的时候通过构造函数 传进去r 然后通过start 调用该方法
if(r!=null)
r.run();
}
public void start(){
run();
}
}
Runnable 仅仅是将线程的任务进行了对象的封装 而不需要继承Thread
Thread 的 run 也来自Runnable 不过做了一个默认的实现
用静态限制具有局限性 (有2个100张票要卖)
1个线程不能启动多次 算是在主线程异常 在主函数内的是主线程异常 run里面的才是其他线程异常
Ticket t = new Ticket(); //创建一个线程任务对象 通过Runnable接口
Thread t = new Thread(t);
Thread t1 = new Thread(t);
Thread t2= new Thread(t);
Thread t3= new Thread(t);
Demo r = new Demo();
Thread t = new Thread(r);
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
Thread t3 = new Thread(r);
t.start();
t1.start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
r.flag = false;
t2.start();
t3.start();
}
}
class Demo implements Runnable{
private int num = 100;
boolean flag = true;
Object obj = new Object();
public void run() {
if (flag) {
while (true) {
synchronized (obj) {
show();
}
}
} else
while (true) {
this.show();
}
}
public synchronized void show() {
synchronized (obj) { //卡在这 一个this 一个 obj
if (num > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "..." + num--);
}
}
}
}
简单点的死锁
public static void main(String[] args) {
Demo r = new Demo(true);
Demo r1 = new Demo(false);
Thread t = new Thread(r);
Thread t1 = new Thread(r1);
t.start();
t1.start();
}
}
class Demo implements Runnable{
boolean flag = true;
Demo(boolean flag){
this.flag = flag;
}
public void run() {
if(flag) {
while(true) {
synchronized (MyLock.locka) {
System.out.println(Thread.currentThread().getName()+"if locka");
synchronized(MyLock.lockb) {
System.out.println(Thread.currentThread().getName()+"if lock b");
}
}
}
}
else {
while(true) {
synchronized (MyLock.lockb) {
System.out.println(Thread.currentThread().getName()+" else lockb");
synchronized(MyLock.locka) {
System.out.println(Thread.currentThread().getName()+" else locka");
}
}
}
}
}
}
class MyLock {
public static final Object locka = new Object();
public static final Object lockb = new Object();
}