1.多线程的两种实现方式:
1.继承Thread类:
1.定义一个类,继承Thread类
2.重写run方法,把需要在多线程中执行代码写在run方法中
3.创建该类对象,调用start方法,启动线程
2.实现Runnable接口:
1.定义一个类实现Runnable接口
2.重写run方法,把需要在多线程中执行代码写在run方法中
3.创建该类对象
4.把该类对象作为参数传递给Thread类的构造方法, 创建Thread类的对象
5.调用Thread对象中的start方法,启动线程,该线程会执行run方法中的内容.
2.两者的区别:
1.一个是继承Thread类,代码简单,不能再继承其他类.
2.另一个是实现Runnable接口,代码复杂,扩展性强.
3.Thread类中常用的方法:
getName() //获取线程的名字
setName() //设置线程的名字
(掌握)currentThread() //获取当前的线程对象(静态方法,类名直接调用)
(掌握)sleep() //让线程休眠(静态方法,类名直接调用)
setDaemon() //当传入的参数是true时,该线程被设置为守护线程.(这个线程在所有线程结束后自动结束,不需要执行完所有内容,但是,如果在其他线程没有结束前,已经执行完所有代码了,也会结束.)
(掌握)join() //插入一个线程,让这个线程优先执行,执行完之后再让别的线程执行.
yield() //礼让线程.让出CPU给别的线程,但实际没什么效果.(了解)
setPriority(int) //设置线程优先级,1-10,数字越大执行次数越多.(了解)
4.同步:
1.同步代码块:
synchronized(锁对象){ ... }
1.锁对象可以是任意对象,但是必须是同一个对象
2.同步代码块必须是在多线程中才有意义.
2.同步方法:
1.非静态同步方法的锁对象:this
2.静态的同步方法的锁对象是: 当前所在的类的字节码对象
3.什么时候使用同步代码块,什么时候使用同步方法?
1.如果一个方法中,所有的内容都是需要同步的,可以使用同步方法.(能使用同步方法的地方都可以使用同步代码块)
2.同步方法的锁对象是固定的,所以如果需要使用别的对象作为锁对象,就不能使用同步方法.
4.卖火车票的案例(两种实现方式)
5.死锁:(不要写这样的代码)
产生的原因:
同步代码块嵌套.
6.以前学过的同步的类:(了解)
Hashtable Vector StringBuffer
|