线程是一个程序里面不同的执行路径.
一个CPU在同一时间里只能执行一个线程。
创建线程有两个方法:
1
创建一个新的线程,通过创建Thead的实例来创建新的线程.*可以定义一个Thread的子类并重写其run方法如:
class MyThread extenfd Thead{
public void run(){…}
}
*然后生成该类的对象:
MyThread myThread = new MyThead(…)
2
通过实现runnable接口来实现.*定义线程类实现Runnable接口
*Thread myThread = new Thead(target) //target为Runnable接口类型.
*Runnable中只有一个方法:
public void run(); 用以定义线程运行体.
*使用Runnable接口的类的run方法定义中可以使用Thread的静态方法;
public static Thread currentThread() 获取当前线程的引用.
启动线程的两个方法:
1 通过调用Thead类的start()方法来启动一个新的线程.(线程启动)
2 直接调用run方法(方法调用)
线程状态转换:
Sleep join yield方法:
Thread.sleep()将当前线程睡眠制定毫秒数(是一个静态方法)
sleep会抛出InterruptedException异常
join()调用某线程的该方法,将当前线程与该线程"合并",即等待该线程结束,再恢复当前线程的运行.(相当于run的方法调用)
yield()让出CPU,当前线程进入就绪队列等待调度.
线程的优先级
getPriotity()获得线程的优先级数值
setPriority()设置线程的优先级数值
优先级越高得到CPU执行的时间片越多
currentThread()拿到当前线程
线程同步:
Synchronized(this)锁定当前对象:在执行语句过程之中,不会被另外一个线程打断。
死锁:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程
给当前对象加锁:非加锁的方法还可以自由的访问,加锁的只是说另外一个线程不可能再访问加锁方法里面的东西。
互斥:某一个时间段,保证只有一个线程进入到方法体里面。不保证其他的线程是不是能够进到另外一个方法里面。
Stop:停止执行该线程,丢失锁,而且无法再次执行
Notify:叫醒一个stop、,使该线程可以继续执行。
Wait 和sleep的区别:
Wait是Object的方法,sleep是thread的方法
Wait停止执行该线程,丢失锁,而且无法再次执行
Sleep:停止执行该线程,不丢失锁,不用notify也可再次执行。