多线程:
(1)多线程:就是指应用程序有多条执行路径。
进程:正在运行的应用程序。
线程:程序的执行单元。执行路径。
举例:
360的管理界面,迅雷下载。
吃饭案例:
单进程单线程:单人一桌菜。
单进程多线程:多人一桌菜。
多进程多线程:多人多桌菜。
(2)多线程的实现方案:
A:继承Thread类。
B:实现Runnable接口。
(3)多线程程序的随机性原理:
CPU在多个程序间做着高效的切换执行。
(4)线程的生命周期:
新建
就绪
运行
阻塞
死亡
(5)线程安全问题的产生及解决:
A:产生的原因:
a:是否是多线程
b:是否有共享数据
c:共享数据是否被多条语句操作
B:解决方案:
同步代码块。
synchronized(对象锁) {
被同步的代码
}
注意:这里的对象锁可以是任意对象。
但是,一定要保证多个线程使用的锁是同一把。
(6)线程安全的类:
StringBuffer
Vector
Hashtable
(7)多线程中同步的方式:
A:同步代码块
锁对象是任意对象。
B:同步方法
锁对象是this对象。
代码解析:
/*
* 同步代码块的锁可以是任意对象。
*
* 同步方法的锁对象是谁?
* this对象。
*
* 静态方法的锁对象是谁?
* 当前类的字节码文件对象。
* Object -- getClass()
* 数据类型.class 字节码文件对象
*
*/
public class TicketDemo {
public static void main(String[] args) {
// 创建一个票资源对象
Ticket t = new Ticket();
// 创建四个线程对象
Thread t1 = new Thread(t, "窗口1");
Thread t2 = new Thread(t, "窗口2");
Thread t3 = new Thread(t, "窗口3");
Thread t4 = new Thread(t, "窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
注意:
静态方法的锁对象是当前类的字节码文件对象。
(8)线程间的通信:
需求:把学生对象看在一个资源,有一个设置属性的线程,有一个获取属性的线程。
首先,我们讲解了一些基本问题。
其次,我们讲解了线程安全问题,并解决了线程安全问题。
最后,我们还讲解了等待唤醒机制,让数据一人一次。
(9)几个小方法:
线程优先级
加入线程
暂停线程
守护线程
代码解析:/*
* 线程的优先级:
* 线程的默认优先级是5。
* 线程的优先级范围是:1-10。
* 优先级只有在次数特别多的时候,才可能让你看到级别高的能优先执行。
*
* public final int getPriority():获取线程优先级
* public final void setPriority(int newPriority):更改线程优先级
*/
public class PriorityDemoTest {
public static void main(String[] args) {
PriorityDemo pd = new PriorityDemo();
Thread t1 = new Thread(pd, "父亲");
Thread t2 = new Thread(pd, "母亲");
Thread t3 = new Thread(pd, "妻子");
t1.setPriority(10);
t2.setPriority(1);
t1.start();
t2.start();
t3.start();
}
}
(10)开发的用法:
用匿名内部类的方式。
new Thread(){
...
}.start();
new Thread(new Runnable(){
...
}).start();
注意:JDK5以后的Lock锁对象。可以让我们非常明确的看到在哪里加上锁,在哪里释放锁
代码体现:
/*
* JDK5以后,出现了一个新的接口:Lock
*/
public class LockDemoTest {
public static void main(String[] args) {
// 创建一个票资源对象
LockDemo t = new LockDemo();
// 创建四个线程对象
Thread t1 = new Thread(t, "窗口1");
Thread t2 = new Thread(t, "窗口2");
Thread t3 = new Thread(t, "窗口3");
Thread t4 = new Thread(t, "窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}