处于生命周期的线程,通过调度实现各种状态下的转换。线程的调度是使用各种线程调度方法,如setPriority(),sleep(),yield(),join()等,对线程进行不同的操作。对于各种线程调度的方法,下面分别进行介绍。
1.线程优先级
线程的优先级是指线程被系统调度执行时的优先执行级别。在多线程程序中,往往是多个线程同时等待执行,但是每个线程的重要性是不一样的,在同等的情况下,有些重要的线程优先执行。在java中通过调用setPtiority()方法为线程设置优先级。
下面来个例子
class MyThread extends Thread{
public void run(){
for(int i=0;i<10;i++)
{
System.out.println(i);
yield();
}
}
}
public class Test30 {
public static void main(String args[]){
MyThread t1=new MyThread();
MyThread t2=new MyThread();
t1.setPriority(1);
t2.setPriority(10);
t1.start();
t2.start();
}
}
优先级用0~10数字表示,数字越大,优先级越高。t2的优先级比t1高,实际效果是执行t2线程。
2.线程让步yield()
对于正在执行的线程,可以调动yield()方法让他们重新排队,将CPU让给排在后面的线程,此线程装换为就绪状态。*注意yield()方法只让步给高优先级(上述程序)或同等优先级的线程,如果是底优先级线程,则继续执行此线程,此方法没有参数,也没有声明任何异常。*下面上例子
class MyThread extends Thread{
public void run(){
for(int i=0;i<10;i++)
{
System.out.println(i);
yield();
}
}
}
public class Test30 {
public static void main(String args[]){
MyThread t1=new MyThread();
MyThread t2=new MyThread();
t1.start();
t2.start();
}
}
每次迭代都要执行让步,所以t1和t2将会交替 打印0~9数字
3.线程等待jion()
说的简单点就是让t1线程执行完,再执行t2.来上列子。
class MyThread extends Thread{
public void run(){
for(int i=0;i<10;i++)
{
System.out.println(i);
}
}
}
public class Test30 {
public static void main(String args[]) throws InterruptedException{
MyThread t1=new MyThread();
MyThread t2=new MyThread();
t1.start();
t1.join();
t2.start();
}
}
执行结果是0
0123456789 //t1
0123456789 //t2
4.线程的休眠sleep()
再执行的线程中,调用sleep()方法让线程放弃CPU进行休眠,此线程装换阻塞状态。说的简单点,可以指定休眠时间每隔一定的时间打印0~9数字。下面以每隔1秒为例,注意单位是毫秒。
class MyThread2 extends Thread{
public void run(){
for(int i=0;i<10;i++){
System.out.println(i);
try{
sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
public class Test32 {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread2 t=new MyThread2();
t.start();
}
}