1、创建线程:
a、通过继承Thread类,重写run方法。
Thread类实现了Runnable接口。
b、通过实现Runnable接口
编写好一个实现了Runnable的类以后,通过
Thread thread=new Thread(MyRunnable,线程名字)。
2、线程的睡眠
sleep():参数指的是毫秒值。
3、线程的礼让
yield():暂停当前正在执行的线程对象,并执行其他线程。
sleep和yield的区别:
sleep指的是让当前线程进入指定时间内的休眠状态,休眠完成后进入就绪状态,yield的意思是当前线程让出资源,立马进入就绪状态。
4、线程的合并
join()方法:使其他线程等待当前线程停止。
InterruptedException异常:出现的地方--sleep/join/wait/
5、线程的生命周期:
1)、新建 new
2)、就绪 线程进入可执行序列,start方法,阻塞状态的线程不再阻塞,进入就绪状态。
3)、运行
4)、阻塞 Thread.sleep/Thread.yield()/Obj.wait()。
5)、死亡
6、线程的优先级。
线程的优先级:1-10. 最大10,最小1,默认5
线程的优先级在start()方法之前调用。
setPriority(int) 设置优先级。
线程的优先级的执行顺序是一种概率事件,优先级高的线程获取到CUP资源的可能性大于优先级低的线程。Java线程中的优先级还跟宿主主机有很大的关系,不建议大家将程序构建的正确性依赖线程的优先级。
7、如何终止一个线程。
a、run方法执行完毕。
b、通过stop方法终止,不过不建议使用,产生问题太多。
c、产生异常或错误
d、编写一个标志,通过标志的值来结束进程。
interrupt()方法,不是用来终止正在运行的线程的,它的作用是:给当前线程设置一个线程终端的标志,通过调用interrupted()来判断线程状态,最后结束线程。
当该线程设置了interrupt()时,线程受到阻塞,抛出InterruptedException异常。
总结:要想中断一个一直运行的线程,请使用标志的方法退出线程。
8、多线程访问临界资源时数据安全问题
多个线程间共享的数据称为临界资源(Critical Resource),
由于是线程调度器负责线程的调度,
程序员无法精确控制多线程的交替顺序。
因此,多线程对临界资源的访问有时会导致数据的不一致行。
9、synchronized关键字
a、 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
b、 Java对象默认是可以被多个线程共用的,只是在需要时才启动“互斥锁”机制,成为专用对象。
c、关键字synchronized用来与对象的互斥锁联系
d、当某个对象用synchronized修饰时,表明该对象已启动“互斥锁”机制,
在任一时刻只能由一个线程访问,即使该线程出现堵塞,该对象的被锁定状态也不会解除,其他线程任不能访问该对 象。
10、死锁
a、互斥条件:一个资源每次只能被一个进程使用。
b、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
c、不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
d、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
如何避免死锁:
a、 等待某个资源时,使用超时机制。
b、采用消息通信的通信机制,而不是共享内存的通信机制。
11、ThreadLocal
a、每个线程都有自己的局部变量
每个线程都有一个独立于其他线程的上下文来保存这个变量,一个线程的本地变量对其他线程是不可见的( 有前提,后面解释)
b、独立于变量的初始化副本
ThreadLocal可以给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证不同的线程 都有一份拷贝。
c、状态与某一个线程相关联
ThreadLocal 不是用于解决共享变量的问题的,不是为了协调线程同步而存在,而是为了方便每个线程处 理自己的状态而引入的一个机制。