线程中的几个概念
线程调度机制:统一管理所有线程,分配cpu时间片给需要并发操作的线程时间,获取时间片的线程被cpu执行
时间片:时间片段,就是一个线程能被cpu执行的时间.获得cpu的时间片的线程进入running状态
线程:需要并发运行的任务.
线程start()方法:将线程纳入到线程调度机制,得已并发操作.
线程中和生命周期相关的几个方法
staitc void sleep(long time):使当前线程进入睡眠阻塞.休眠指定的time毫秒,休眠结束后重新回到runnable状态,等待再次获取cpu时间片并发运行
线程睡眠阻塞演示
import java.text.SimpleDateFormat;
import java.util.Date;
public class SleepBlockDemo {
public static void main(String[] args) throws InterruptedException{
/*
每秒钟输出一次当前系统时间
*/
SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
for(;;){
System.out.println(sdf.format(new Date()));
for(int i=0;i<8;i++){
System.out.println();
}
//停顿一秒钟
Thread.sleep(1000);
}
}
}
void interrupt():中断线程,若线程处于睡眠阻塞时将该线程中断,会引发中断异常.InterruptedException
main方法实际上也是一个线程在运行的.
当我们运行一个java程序时,操作系统会启动一个进程来运行这个程序,而虚拟机启动起来后,会创建一个线程去执行main方法.
中断睡眠阻塞
>public class InterruptSleepBlockDemo {
public static void main(String[] args) {
/*
小品:砸墙
*/
Thread lin=new Thread(()->{
System.out.println("林:刚美完容,睡觉了.");
try{
/*
当前线程进入睡眠阻塞后,若被其他线程中断,这里就会引发中断异常.
*/
Thread.sleep(1000000);
}catch(InterruptedException e){
//e.printStackTrace();
System.out.println("干嘛呢!干嘛呢!都破了相了都!");
}
});
Thread huang=new Thread(()->{
for(int i=0;i<5;i++){
System.out.println("黄:八十!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("黄:搞定!");
//中断lin线程
/*
一个方法中的局部内部类中若想引用该方
法的其他局部变量,那么被引用的变量
应该是final的
*/
lin.interrupt();
}
);
lin.start();
huang.start();
}
}
final void setPriority(int p):设置线程的优先级.优先级越高的线程理论上被分配的时间片的机会越多.
优先级的取值范围:
常量:Max_PRIORITY 最高优先级,值为10
MIN_PRIORITY 最低优先级,值为1
NORM_PRIORITY 默认优先级,值为5
线程优先级
设置优先级相当于求求线程先执行,看心情,他可能不会先执行你
>public class PriorityDemo {
public static void main(String[] args) {
Thread max=new Thread(()->{
for(int i=0;i<10000;i++){
System.out.println("我\"可能\"最快!");
}
});
Thread min=new Thread(()->{
for(int i=0;i<10000;i++){
System.out.println("我\"可能\"最慢");
}
});
Thread nor=new Thread(()->{
for(int i=0;i<10000;i++){
System.out.println("我\"可能\"不快也不慢");
}
});
//设置最高优先级
max.setPriority(Thread.MAX_PRIORITY);
//设置最低优先级
min.setPriority(Thread.MIN_PRIORITY);
//不设置就是默认优先级,不过为了练习还是写一下
nor.setPriority(Thread.NORM_PRIORITY);
min.start();//放入并发
nor.start();//放入
max.start();
}
}
使用线程,不应该纠结线程执行的先后顺序.因为是不确定的.