1.Thread
- extends Thread
2.Runnable
- implements Runnable
3.两者初步理解
- 任务管理器中设置相关性(为于演示理解)
- 选一个cpu(运行多线程要在一个CPU上运行)
- Java语言中只能继承一个类,所以Thread单根继承,但如果继承了它 应用就不好继承其它类了
- Java可以实现多个接口,所以一般场景多选择实现Runnable。
- 启动一个线程一定要调用它的start方法,而不能调用它的run方法。
- 一个线程对象不可以start(启动)两次
4.线程生命周期
- 正常曲线:新建→就绪→运行→死亡
- 非正常:运行→堵塞→就绪→运行
5.抢占式(多)、设置优先级、后台线程学习
-
抢占式学习、设置优先级
(在线程启动前设定)- wq4.setPriority(Thread.MAX_PRIORITY);//设置最高优先级
- wq1.setPriority(Thread.MIN_PRIORITY);//最低
-
设置为后台线程
- wq1.setDaemon(true);
- 为线程设置名称
- wq.setName("b");
6.线程让步
-
yield()
- 要想线程让步:(必须满足下面两个条件)
- 1.存在另外的线程优先级大于等于我
- 2.另外的线程处于就绪状态
- 要想线程让步:(必须满足下面两个条件)
7.参与
-
join()
- join线程 让其他进程参与 自己处于堵塞状态 直到其他结束再执行
8.线程同步
-
synchronized
- public synchronized void run() {}//1.同步方法
- synchronized (this){}//2.同步代码块
- 释放锁(持有锁的线程在以下情况会释放锁:)
- 1.执行完同步代码块
- 2.执行同步代码块的过程中,遇到异常而导致线程终止
- 3.在执行同步代码块的过程中,执行了锁所属对象的wait()方法
- ★执行sleep()和yield()都不会释放锁
9.线程通信
- wait()
- 执行该方法的线程释放对象的锁,Java虚拟机把该线程放到该对象的等待池中。该线程将等待其他线程将其唤醒。
- notify()
- 执行该方法的线程唤醒在对象的等待池中等待的一个线程。Java虚拟机从对象等待池中随机选择一个线程,把它转到对象的锁池中。
- notifyAll()
- Object类还有一个notifyAll()方法,该方法将会唤醒所有在这个对象锁池中的所有线程。
网友评论