线程
1.相关词汇
Thread:线,线程runnable:可追捕的
current:当前的,最近的
sleep:睡眠
yield:屈服,屈从
interrupted:中断的,被阻止的
daemon:后台程序
wait:等待,等候
notify:通报
synchronized:同步的(同一时刻只允许一个人访问,防止第二个访问的用户获取的数据是用户一修改的)
2.优先级
优先级较高的线程有更多获得CPU的机会,优先级的取值范围1~10,线程的默认优先级是5,通过setPriority和getPriority方法舍子或返回优先级。
MAX_PRIORITY:最大优先级 MIN_PRIORITY:最小优先级 NORM_PRIORITY:默认优先级
3.与线程状态相关的部分方法
(1)等待线程终止
final void join()
throws InterruptedException
(2)判断线程是否处于活动状态
final boolean isAlive()
(3)中断线程
void interrupt()
4.sleep和yield的区别:
(1).sleep给其他线程运行的机会,不考虑其他线程的优先级;yield只会让位给相同或更高优先级的线程。
(2).线程执行了sleep方法后转到阻塞状态,执行了yield方法后转到就绪状态。
(3).sleep方法可能抛出异常,yield不会。
5.join方法:用于等待其他线程结束,当前运行的线程可以调用另一线程的join方法,当前线程转到阻塞状态直到另一线程执行结束,它才会恢复运行。
6.多线程的验证
public class Test {
public static void main(String[] args) {
System.out.println("主方法开始"); //线程开始出现分支(多线程),thread与"主方法结束"同时进行,由谁先执行完决定输出顺序
MyThread thread=new MyThread();
thread.start();
System.out.println("主方法结束");
}
}
class MyThread extends Thread{
public void run(){
for(int i=0;i<=100;i++){
System.out.println("i的值时:"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
输出结果: 主方法开始
主方法结束
i的值时:0
i的值时:1
i的值时:2....
7.模拟来客泡茶过程
public class Test2 {
public static void main(String[] args) throws InterruptedException {
WashOp wo=new WashOp();
BoilWaterOp bo=new BoilWaterOp();
Thread t1=new Thread(bo,"烧水工");
Thread t2=new Thread(wo,"洗碗工");
t1.start();
t2.start();
t1.join();
t2.join(); //等待该线程结束,才能执行下面的进程
System.out.println("开始泡茶");
}
}
class WashOp extends Thread{
public void run(){
for(int i=1;i<10;i++){
System.out.println(Thread.currentThread().getName()+"在洗第"+i+"个杯子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"杯子洗好了");
}
}
class BoilWaterOp extends Thread{
public void run(){
System.out.println(Thread.currentThread().getName()+"开始烧水");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"水烧好了");
}
}
输出结果:
烧水工开始烧水
洗碗工在洗第1个杯子
烧水工水烧好了
洗碗工在洗第2个杯子
洗碗工在洗第3个杯子
洗碗工在洗第4个杯子
洗碗工在洗第5个杯子
洗碗工在洗第6个杯子
洗碗工在洗第7个杯子
洗碗工在洗第8个杯子
洗碗工在洗第9个杯子
洗碗工杯子洗好了
开始泡茶