①如果没有给线程设置名字,线程是有默认名字 的:
Thread-X
(X序号,从0开始)
②如果要给线程设置名字,可以使用set方法
或者子类继承Thread的构造方法
设置。
例如:MyThread t1 = new MyThread("坦克");
③currentThread()
方法:
当JVM虚拟机启动之后,会自动的启动多条线程,
其中有一条线程就叫做main线程,
他的作用就是去调用main方法,并执行里面的代码,
在以前,我们写的所有的代码,其实都是运行在main线程
当中。
④sleep(long time)
:
让当前执行的线程睡眠对应的时间,参数单位为毫秒,当睡眠时间结束后,线程会继承执行后面的其他代码。
线程的调度分为抢占式调度(随机性)和非抢占式调度。
线程优先级最小为1,最大是10,默认是5
。
定义一个类实现Runnable接口
public class Myrun implements Runnable {
@Override
public void run() {
//重写方法
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":hello world!" + i);
}
}
}
测试类:查看线程优先权,修改线程优先权并运行查看线程的执行顺序。
public class Demo2 {
public static void main(String[] args) {
//创建线程要执行的参数对象
Myrun mr = new Myrun();
//创建线程对象
Thread t1 = new Thread(mr, "飞机");
Thread t2 = new Thread(mr, "坦克");
//查看线程的优先级
System.out.println(t1.getPriority());//5
System.out.println(t2.getPriority());//5
//修改优先级
t1.setPriority(1);
t2.setPriority(10);
//运行线程
t1.start();
t2.start();
}
}
当非守护线程结束之后,
守护线程会陆续结束
。
应用场景:当聊天窗口关闭时,传输文件(守护线程)就没有存在的必要了。
定义守护线程,继承父类,重写run方法:打印100次线程名:
public class MyThread1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName()+"@"+i);
}
}
}
定义非守护线程:打印10次线程名
public class MyThread2 extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName()+"@"+i);
}
}
}
主函数:观察守护线程的结束时机
public class Demo1 {
public static void main(String[] args) {
//创建线程
MyThread1 t1 = new MyThread1();
MyThread2 t2 = new MyThread2();
//设置线程名
t1.setName("女神");
t2.setName(" 备胎");
//把第二个线程设置为守护线程
t2.setDaemon(true);
//启动线程,观察守护线程的结束时机
t1.start();
t2.start();
}
}
①
出让
线程/礼让线程:Thread.yield();
让线程的执行尽可能地均匀分布。
②插入线程:t.join();
表示将t线程插入到当前线程之前运行。