一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情
1 设置和获取线程名称
- Thread类中设置和获取线程名称的方法
| 方法名 | 说明 |
|---|---|
| void setName(Stringname) | 将此线程的名称更改为等于参数name |
| String getName() | 返回此线程的名称 |
| public Thread(String name) | 通过构造方法也可以设置线程名称 |
| public static Thread currentThread() | 返回对当前正在执行的线程对象的引用(可以返回main()方法中线程) |
| public static void sleep(long time) | 让当前线程休眠多少毫秒再继续执行 |
- MyThread类
package test;
public class MyThread extends Thread{
//构造方法添加线程名称
public MyThread(){}
public MyThread(String name) {
super(name);
}
@Override
public void run() {
for(int i=0;i<100;i++) {
//1,String getName() 返回此线程的名称
System.out.println(getName()+":"+i);
}
}
}
- 测试类
package test;
public class Demo {
public static void main(String[] args) {
/* MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
//2,void setName(Stringname) 将此线程的名称更改为等于参数name
my1.setName("高铁");
my2.setName("飞机");*/
//3,通过构造方法设置线程名称
//需要自己定义的类中提供此带参构造方法,并通过super访问父类带参构造方法
/*MyThread my1 = new MyThread("高铁");
MyThread my2 = new MyThread("飞机");
my1.start();
my2.start();*/
//4,public static Thread currentThread() 返回对当前正在执行的线程对象的引用(可以返回main()方法中线程)
System.out.println(Tread.currentThread().getName()); //main
}
}
2 线程调度
-
线程有两种调度模型
- 分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
- 抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些
-
Java使用的是抢占式调度模型
-
假如计算机只有一个CPU, 那么CPU在某一个时刻只能执行条指令, 线程只有得到CPU时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性,因为谁抢到CPU的使用权是不一定的
-
Thread类中设置和获取线程优先级的方法
| 方法名 | 说明 |
|---|---|
| public final int getPriority() [praɪˈɔːrəti] | 返回此线程的优先级 |
| public final void setPriority(int newPriority) | 更改此线程的优先级 |
- 线程默认优先级是 5 ;线程优先级范围是: 1-10
- 线程优先级高仅仅表示线程获取的CPU时间的几率高,但是要在次数比较多,或者多次运行的时候才能看到你想要的效果
package test;
public class Demo {
public static void main(String[] args) {
ThreadPriority tp1 = new ThreadPriority();
ThreadPriority tp2 = new ThreadPriority();
ThreadPriority tp3 = new ThreadPriority();
tp1.setName("高铁");
tp2.setName("飞机");
tp3.setName("汽车");
//1,public final int getPriority() [praɪˈɔːrəti] 返回此线程的优先级
// System.out.println(tp1.getPriority()); //5
// System.out.println(tp2.getPriority()); //5
// System.out.println(tp3.getPriority()); //5
//2,public final void setPriority(int newPriority) 更改此线程的优先级
System.out.println(Thread.MAX_PRIORITY); //10
System.out.println(Thread.MIN_PRIORITY); //1
System.out.println(Thread.NORM_PRIORITY); //5
//设置正确优先级
tp1.setPriority(5);
tp2.setPriority(10);
tp3.setPriority(1);
tp1.start();
tp2.start();
tp3.start();
}
}
3 线程控制
| 方法名 | 说明 |
|---|---|
| static void sleep(long millis) | 使当前正在执行的线程停留(暂停执行)指定的毫秒数 |
| void join() | 等待这个线程死亡 |
| void setDaemon(boolean on) [ˈdiːmən] | 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机很快将退出 (并不是立刻退出) |
案例:sleep()方法
- 线程类
package test;
public class ThreadSleep extends Thread{
@Override
public void run() {
for(int i=0;i<10;i++) {
System.out.println(getName()+":"+i);
//1,static void sleep(long millis) 使当前正在执行的线程停留(暂停执行)指定的毫秒数
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- 测试类
package test;
public class Demo {
public static void main(String[] args) {
ThreadSleep ts1 = new ThreadSleep();
ThreadSleep ts2 = new ThreadSleep();
ThreadSleep ts3 = new ThreadSleep();
ts1.setName("曹操");
ts2.setName("刘备");
ts3.setName("孙权");
ts1.start();
ts2.start();
ts3.start();
// 曹操:0
// 孙权:0
// 刘备:0
// 孙权:1
// 曹操:1
// 刘备:1
// ...
}
}