多线程:
线程都有自己的默认名称 Thread-从0开始,通过this.getName()获得
currentThread():获取当前线程的对象
设置线程名称:通过setName()或者构造函数
**创建线程的第二种方法:
1.定义实现Runable接口
2.覆盖Runable接口中的run方法
3.通过Thread类建立线程对象
4.将Runable接口的子类对象传递给Thread类的构造函数
5.调用Thread类的start方法开启线程并调用Runable接口子类的run方法
实现方式和继承方式的区别:
实现方式的好处:避免单继承的局限性。
在定义线程时,建议使用实现方式
继承Thread:线程代码存放在Thread子类run方法中
实现Runable:线程代码存放在接口的子类的run方法。
***线程安全问题用同步代码块
synchronized(对象)
{
需要被同步的代码块
}
同步函数使用的锁是this
public synchronized void show(){ }
静态同步方法,使用的锁是该方法所在类的字节码文件对象。 类名.class
/*
wait();notify();notifyAll();
都是用在同步中,因为要对持有监视器(锁)的线程操作。
所以要使用在同步中,因为只有同步才具有锁。
等待和唤醒必须是同一个锁。
而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中
在多个输入者,多个输出者的情况下,必须使用while循环判断标记,并且唤醒全部notifyAll();
*/
*JDk1.5 中提供了多线程升级解决方案。
*将同步Synchronized替换成显式Lock操作
*将Object中的wait,notify,notifyAll,替换了Condition对象
*该对象可以通过Lock锁进行获取
*注释部分实现了本方法只唤醒对方操作
停止线程的方法,控制循环让run方法结束,线程也会结束
特殊情况:当线程处于冻结状态。就不会读取到标记,就不会结束。可以在异常里改变标记,让线程结束
Thread类提供该方法interrupt()强制唤醒线程
****守护线程******
线程.setDaemon(true)
跟随被守护的线程一起灭亡
**join()方法
当线程A执行到了B线程的.join()方法时,A就会等待。等B线程执行完,A才会执行
join可以用来临时加入线程执行
**可以设置优先级(1-10级)
**yield()减缓线程的执行
|
|