package com.demo;
/*
* 线程的常用方法:
* Thread(String name) 初始化线程的名字
* getName() 返回线程的名字
* setName(String name) 设置线程名字
*
* sleep() 线程睡眠指定的毫秒数。
* 静态的方法,哪个线程执行了sleep()方法,就是哪个线程睡眠;
*
* currentThread() 返回当前的线程对象。
* 静态方法,哪个线程执行了currentThread()方法,就返回哪个线程的对象;
*
* getPriority() 返回当前线程对象的优先级, 默认线程的优先级是5;
* 优先级越高的线程,获取CPU执行权的几率越高;
*
* setPriority(int newPriority) 设置线程的优先级,虽然设置了线程的优先级,但是具体的实现取决于底层的
* 操作系统的实现(最大的优先级是10 ,最小的1 , 默认是5)。
*/
public class Demo2 extends Thread {
// 无参构造
public Demo2(){
}
// 带参构造
public Demo2(String name) {
super(name); // 显示调用父类的构造
}
@Override
public void run() {
for (int i = 0; i < 20; i++){
try {
// run()方法中的所有代码都是自定义线程在执行,所以此处睡眠的是自己定义的线程;
// 此处不能抛出异常,只能捕获,是因为父类(Thread类)中的run方法没有抛出异常;
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.getName() + ":" + i); // this表示当前线程
}
// 证明this就是当前线程
System.out.println("this对象: " + this);
System.out.println("当前线程对象: " + Thread.currentThread());
}
public static void main(String[] args) throws InterruptedException {
Demo2 d1 = new Demo2();
System.out.println("线程默认名字:" + d1.getName()); // Thread-0(默认名字)
// d1.start();
Demo2 d2 = new Demo2();
System.out.println("线程默认名字:" + d2.getName()); // Thread-1(默认名字)
// d2.start();
Demo2 d3 = new Demo2("自定义线程"); // 指定线程的名字,必须要在构造方法中显示调用父类的构造才可以
System.out.println("初始化线程名字:" + d3.getName());
// d3.start();
Demo2 d4 = new Demo2("线程的名字");
d4.setName("设置的名字"); // 设置线程名字
System.out.println("setName()设置的名字:" + d4.getName());
// d4.start();
Demo2 d5 = new Demo2("睡眠线程");
Demo2.sleep(1000); // 因为main方法中的所有代码都是主线程在执行,所以此处睡眠的是主线程;
// d5.start();
// 此处获取的是main线程;
System.out.println("当前线程:" + Thread.currentThread().getName());
// 线程的默认优先级都是5;
Demo2 d6 = new Demo2();
System.out.println("自定义线程的优先级:" + d6.getPriority());
System.out.println("主线程优先级:" + Thread.currentThread().getPriority());
// d6.start();
}
}