线程的调度与控制 线程的生命周期
/*
线程的调度与控制:
一般计算机中只有一个CPU,cpu在执行某条指令,线程才得到了CPU的时间片,也就是使用权。
在单cpu上,线程不是并行运行的,只有在多cpu上,线程才是并行运行的 ,jvm要负责线程的调度
取得CPU的使用权
两种调度模式:
一种是分时调度:轮流使用,平均分配CPU的时间片
抢占调度:让优先级高的使用CPU,如果优先级相同,随机选择。 java是 抢占式,优先级高的线程获取CPU的时间片相对多一点
线程的优先级:
MAX_PROVIRTY(10) MIN_PROVIRTY(1) NORMAL_PROVIRTY(5) (1-10)
函数:
currentThread() //获取当前线程对象 Thread t=Thread.currentThread();
setName() //设置线程的名字 t.setName()
getName() //获取线程的名字 t.getName()
*/
//创建
Thread t=new Processor();
//启动
t.start();//这段代码执行瞬间结束,告诉jvm 再分配一个新的栈给 t线程
//run() 不需要程序员手动调用
//t.run();//这是普通方法调用,这样之后程序还是只有一个线程。run方法结束之后,下面的才能执行。
//在主线程中执行
for(int i=0;i<100;i++){
System.out.println("main-->"+"i");
}
//有了多线程之后,main 方法结束,是主线程中没有方法栈帧
//但是其他线程栈中可能还有栈帧
//所以可以得出结论,就是,main方法结束,可能程序还没有结束执行。
}
/*
线程的生命周期:
新建 new
就绪 start()
阻塞
运行 run()方法执行
消亡 run()方法结束
*/
/*
线程优先级高的获取的cpu的时间片相对多一些
优先级:从1-10
最低:1
最高:10
默认:5
方法:
setPriority() 设置优先级
getPriority() 获取有优先级
*/
/*
某线程正在休眠,如何打断其休眠:
interruptedException 以下方式靠的是异常处理机
*/
/*
Thread.sleep(毫秒)
sleep 是一个静态方法,使用 类名.方法名 调用
作用:阻塞当前线程。腾出cpu让给其他 线程
*/
class Processor04 extends Thread{
//在run方法中的异常 只能用 try{}catch{} 实现
//thread 中的run方法不能抛出异常,所以重写后的run方法之后,在run的声明位置不能用throws
public void run(){
for(int i=0;i<50;i++){
System.out.println(Thread.currentThread().getName()+"i");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/*
Thread.yield
1.是一个静态的方法
2.与sleep 方法类似,只是不能由由用户指定休眠时间,并且这个yield方法只能让同优先级的线程
3.让位的时间不固定
*/
/*
关于线程合并
join 是成员方法,必须使用 引用.调用
//线程合并
t.join();//join 出现在哪个线程,就和哪个线程合并,合并了就变成了单线程的程序
*/