多线程
interrupt()方法只是为线程设置一个中断标记,并没有中断线程运行,一个线程在被设置了中断标记之后仍可运行,isAlive()返回true.实力方法isInterrupted()测试线程的中断标记,并不清除中断标记。而静态的interrupted()方法则不同,他会测试当前执行的线程是否被中断,并且在肯定的情况下,清除当前线程对象的中断标记并返回true
把线程从就绪状态进入运行状态的过程叫做线程调度。负责调度工作的机构叫做调度管理器。
优先级:线程的优先级的取值范围是1-10。
MAX_PRIORITY =10
NORM_PRIORITY =5
MIN_PRIORITY =1
得到或修改线程的优先级
public final int getPriority();
public final void setPriority(int newPriority
void run() //创建该类的子类时必须实现的方法
void start() //开启线程的方法
static void sleep(long t) //释放CPU的执行权,不释放锁
static void sleep(long millis,int nanos)
final void wait()//释放CPU的执行权,释放锁
final void notify()
static void yied()//可以对当前线程进行临时暂停(让线程将资源释放出来)
public final void stop()//结束线程,但由于安全的原因过时
注意:结束线程原理:就是让run方法结束。而run方法中通常会定义循环结构,所以只要控制住循环即可。
方法----可以boolean标记的形式完成,只要在某一情况下将标记改变,让循环停止即可让线程结束。但是,特殊情况,线程在运行过程中,处于了冻结状态,是不可能读取标记的。
那么这时,可以通过正常方式恢复到可运行状态,也可以强制让线程恢复到可运行状态,通过Thread类中的,interrupt():清除线程的冻结状态,但这种强制清除会发生InterruptedException。所以在使用 wait,sleep,join方法的时候都需要进行异常处理。
public final void join()//让线程加入执行,执行某一线程join方法的线程会被冻结,等待某一线程执行结束,该线程才会恢复到可运行状态
public final boolean isAlive()
将线程标记为守护线程(后台线程):setDaemon(true);注意该方法要在线程开启前使用。和前台线程一样开启,并抢资源运行,所不同的是,当前台线程都结束后,后台线程会自动结束。无论后台线程处于什么状态都会自动结束。
//模拟临界资源的类
classTickets{
public int tickets;
public Tickets(){
tickets=10;
}
public synchronized void action(Stringname){
System.out.println(name+"抢到了第"+tickets+"号票");
}
}
//访问数据的线程
classTicketsThread extends Thread{
Tickets t;
String name;
public TicketsThread(Tickets t,String name){
this.t=t;
this.name=name;
start();
}
public void run(){
try{
for(int i=0;i<5;i++){
t.action(name);
Thread.sleep(10);
}
}catch(Exception e){}
}
}
//测试多线程访问时的问题
publicclass TestMulThread2 {
public static void main(String[] args){
Tickets t=new Tickets();
TicketsThread d1=newTicketsThread(t,"张三");
TicketsThread d2=newTicketsThread(t,"李四");
TicketsThread d3=newTicketsThread(t,"赵五");
TicketsThread d4=newTicketsThread(t,"王六");
}
}