}
}
}
if (i % 10 == 0) { }
Thread.yield();
package com.px1987.j2se.thread.StateControl; public class YieldTest { }
public static void main(String[] args) { }
Runnable r1 = new Thread5(\Runnable r2 = new Thread5(\Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); t1.start(); t2.start(); try { }
catch (InterruptedException e) { }
System.out.println(\
e.printStackTrace(); Thread.sleep(2);
该程序的部分运行结果如下: S1: 20 S2: 7 S2: 8 S2: 9 S2: 10 S1: 41 S1: 42 S1: 43 S1: 44 S1: 45 S1: 46 S1: 47 S1: 48 S1: 49 S1: 50 S2: 11 S2: 12 (3)join方法
当某个(A)线程等待另一个线程(B)执行结束后,才继续执行时,使用join方法。A的 run
方法调用b.join()。下面为代码示例。
package com.px1987.j2se.thread.join; class FatherThread implements Runnable {
public void run() {
System.out.println(\爸爸想抽烟,发现烟抽完了\System.out.println(\爸爸让儿子去买包红塔山\Thread son = new Thread(new SonThread()); son.start();
System.out.println(\爸爸等儿子买烟回来\try { }
catch (InterruptedException e) {
}
package com.px1987.j2se.thread.join; class SonThread implements Runnable { }
public void run() { }
String tabs=\
System.out.println(tabs+\儿子出门去买烟\System.out.println(tabs+\儿子买烟需要10分钟\try { }
catch (InterruptedException e) { }
System.out.println(tabs+\儿子买烟回来了\
e.printStackTrace(); for (int i = 0; i < 10;) { }
Thread.sleep(1000);
System.out.println(tabs+\儿子出去第\分钟\
}
}
System.out.println(\爸爸高兴的接过烟开始抽,并把零钱给了儿子\
System.out.println(\爸爸出门去找儿子跑哪去了\System.exit(1);
//join含义:等待son线程执行完毕,father线程才继续执行 son.join();
package com.px1987.j2se.thread.join; public class JoinTest { public static void main(String[] args) { System.out.println(\爸爸和儿子的故事\
Thread father = new Thread(new FatherThread()); father.start(); // try {
// Thread.sleep(5000); // } catch (InterruptedException e) { // e.printStackTrace(); // } // father.interrupt(); } }
该程序的运行结果如下: 爸爸和儿子的故事
爸爸想抽烟,发现烟抽完了 爸爸让儿子去买包红塔山 爸爸等儿子买烟回来
儿子出门去买烟
儿子买烟需要10分钟 儿子出去第1分钟 儿子出去第2分钟 儿子出去第3分钟 儿子出去第4分钟 儿子出去第5分钟 儿子出去第6分钟 儿子出去第7分钟 儿子出去第8分钟 儿子出去第9分钟 儿子出去第10分钟 儿子买烟回来了 爸爸高兴的接过烟开始抽,并把零钱给了儿子
当时间来到儿子出去买烟的时候,Father线程调用interrupt方法就会打断son线程的正常执行,从而father线程也就不必等待son线程执行完毕再行动了,运行结果如下: 爸爸和儿子的故事
爸爸想抽烟,发现烟抽完了 爸爸让儿子去买包红塔山 爸爸等儿子买烟回来
儿子出门去买烟
儿子买烟需要10分钟 儿子出去第1分钟 儿子出去第2分钟 儿子出去第3分钟 儿子出去第4分钟 爸爸出门去找儿子跑哪去了
6.4线程的调度和优先级
1、线程的基本信息
方 法
isAlive()
getPriority() setPriority() setName() getName()
currentThread() 功 能
判断线程是否还“活”着,即线程是否还未终止。 获得线程的优先级数值 设置线程的优先级数值 给线程一个名字 取得线程的名字
取得当前正在运行的线程对象,也就是取得自己本身
2、操作线程的基本信息代码示例
package com.px1987.j2se.thread.priority; public class ThreadInfoTest { }
class MyThread implements Runnable { }
public void run() { }
for (int i = 0; i < 100; i++)
System.out.println(i);
public static void main(String[] argc) throws Exception { }
Runnable r = new MyThread();
Thread t = new Thread(r, \t.start();
System.out.println(\Thread.currentThread().sleep(5000); System.out.println(t.isAlive()); System.out.println(\
该程序的运行结果如下:
name is: Name test 0 1 2 3 . . . 97 98 99 false over!
3、线程的优先级
(1)优先级(共10级):
它们决定线程执行的先后次序(优先级高者先执行)并可以通过Thread类中的setPriority()和getPriority()方法来改变和获取优先级。典型的优先级码
? Thread.MIN_PRIORITY (1级)
? Thread.MAX_PRIORITY(10级) ? Thread.NORM_PRIORITY(5级)
(2)调度规则
Java是不支持线程时间片轮换的调度模型,而采用的是线程优先级高低的抢占调度模型。具有高优先级的线程可以抢占低优先级线程运行的机会。高优先级的线程将始终获得线程执行时间。但是这也不是绝对的,java线程调度器有可能会调用长期处于等待的线程进行执行,所以不要依靠线程的高优先级抢占模型去完成某些功能。
Java线程调度器支持不同优先级线程的抢先方式,但其本身不支持相同优先级线程的时间片轮换。但是如果java运行时系统所在的操作系统(如windows2000)支持时间片的轮换,则线程调度器就支持相同优先级线程的时间片轮换。 (3)代码示例
package com.px1987.j2se.thread.priority; public class ThreadPriorityTest { }
class MyThread2 extends Thread { }
public void run() { }
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + \ yield(); }
public static void main(String[] args) { }
Thread t1 = new Thread(new MyThread2(), \Thread t2 = new Thread(new MyThread2(), \t1.setPriority(1); t2.setPriority(10); t1.start(); t2.start();
该程序的运行结果如下:
t1: 0 t2: 0 t2: 1 t2: 2 t2: 3 t2: 4 t2: 5 t2: 6 t2: 7 t2: 8 t2: 9 t1: 1