package thread;//线程停止:线程对象名.stop();线程暂停:线程对象名.suspend();线程继续:线程对象名.resume();
class Print9 implements Runnable {
public void run() {
printpingFang();
} public void printpingFang() {
for (int i = 1; i <= 10; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (Exception ex) {
}
}
}
}public class Test5 {
public static void main(String[] args) {
Print9 p1 = new Print9();
Thread t1 = new Thread(p1);
t1.start();// 启动
try {
Thread.sleep(3000);
} catch (Exception ex) {
}
t1.suspend();// 暂停
try {
Thread.sleep(2000);
} catch (Exception ex) {
}
t1.resume();// 继续
try {
Thread.sleep(2000);
} catch (Exception ex) {
}
t1.stop();//终止

}
}
有一点不是很清楚当线程start之后,过几秒后依次执行暂停,继续,终止,为什么这么执行,
不是应该start之后,打印1,然后sleep1秒,然后再打印2,然后再sleep 1秒,直到全部打完才执行 t1.start下面的语句吗??我知道我的理解是错误的,请高手指点

解决方案 »

  1.   

    在我电脑上的运行结果是:

    sleep 1秒
    2
    sleep 1秒
    3
    暂停,sleep 1,sleep 2,恢复
    4
    sleep 1秒
    5
    结束。
      

  2.   

    这个结果应该跟系统所采用的调度算法有关。
    我的系统应该是时间片轮转调度算法。
    线程t1和线程main是轮换着运行的。所以出现我这个结果是合理的。你理解的那种执行顺序显然是不对的,t1.start()后面的语句属于main线程,它们并不会等到t1.start()全部执行完后才执行,而是和线程t1按照一定的调度算法交替执行。t1.start()在执行到i=3的时候它的时间片用完,此时mian线程开始运行,执行t1.start()后面的语句,当执行到t1.resume()时,t1线程再次获得执行的权利。于是接着做i=4的循环....我不是高手,表达不太清楚,不知道你能否明白。
      

  3.   

    可以这样理解吗???   
     在主程序main(主线程)中 用t1.start();// 启动一个子线程, 然后进入3秒的sleep,而此时子线程进行了 打印1,等待1秒,打印2,等待1秒,打印3,等待1秒, 3秒结束后.!! 此时主线程等待时间结束,并与子线程抢占线程,"强调是与子线程抢占线程,这样说对吗",谁的优先级高执行谁(主线程或者子线程)??这样理解对吗>>>????
      

  4.   

    这个时间片是由操作系统定,具体值不清楚。
    你上面的理解基本对了,子线程和主线程默认的优先级是一样的(普通优先级5),当然你也可以自己设定各线程的优先级(最大优先权10,最小0),具体做法查帮助文档Thread类的方法: void setPriority(int newPriority)  
      

  5.   

    强烈推荐不要是用  t1.stop();//终止
    很暴力的`自己写一个停止条件,是好的习惯程序过程:
    t1.start() 启动 -->由于休眠(Thread.sleep(1000);)3次刚好-->一直休眠3秒(Thread.sleep(3000);)--> 占停了2秒(Thread.sleep(2000));-->重新开始并允许继续活动(t1.resume();)-->暴力停止t1.stop();
    --------------------------------------------------
    t1.resume();// 继续
            try {
                Thread.sleep(2000);  你只继续2秒然后就终止
            } catch (Exception ex) {
            }
    t1.stop();//终止
    说白了``其实你前3秒在运行for循环!由于停止,在次继续上面的代码,也就5秒的时间``你一秒左右打1个,5秒能打多少个就需要````看你计算机速度,最多7个最少可以低于4个!感觉我说了等于没说!- -t1.resume() 其实它是继续执行,当遇到for循环完或stop()程序结束