线程状态的转换

来源:互联网 发布:mysql官方文档有问题 编辑:程序博客网 时间:2024/04/30 09:19

线程离开运行状态的3种方法:

1、调用Thread.sleep():使当前线程睡眠至少多少毫秒(尽管它可能在指定的时间之前被中断)。

睡眠的实现:调用静态方法。

        try {
           Thread.sleep(123);
        } catch (InterruptedException e) {
           e.printStackTrace(); 
        }

 

睡眠的位置:为了让其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。这样才能保证该线程执行过程中会睡眠。

 

2、调用Thread.yield():不能保障太多事情,尽管通常它会让当前运行线程回到可运行性状态,使得有相同优先级的线程有机会执行。

yield()方法的作用是:暂停当前正在执行的线程对象,并执行其他线程。 

结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。

/**
* Java线程:线程的调度-让步
*
* @author leizhimin 2009-11-4 9:02:40
*/
public class Test {
        public static void main(String[] args) {
                Threadt1 = new MyThread1();
                Threadt2 = new Thread(new MyRunnable());

                t2.start();
                t1.start();
        }
}

class MyThread1 extends Thread {
        public void run() {
                for (int i = 0; i < 10;i++) {
                        System.out.println("线程1第" + i + "次执行!");
                }
        }
}

class MyRunnable implements Runnable {
        public void run() {
                for (int i = 0; i < 10;i++) {
                        System.out.println("线程2第" + i + "次执行!");
                        Thread.yield();
                }
        }
}

 

 

3、调用join()方法:保证当前线程停止执行,直到该线程所加入的线程完成为止。然而,如果它加入的线程没有存活,则当前线程不需要停止。

 

 

除了以上三种方式外,还有下面几种特殊情况可能使线程离开运行状态:

1、线程的run()方法完成。

2、在对象上调用wait()方法(不是在线程上调用)。

3、线程不能在对象上获得锁定,它正试图运行该对象的方法代码。

4、线程调度程序可以决定将当前运行状态移动到可运行状态,以便让另一个线程获得运行机会,而不需要任何理由。

原创粉丝点击