前言
Thread是程序中的执行线程
jvm并发地运行多个执行线程
1. 属性值
通过查看Thread源码,是继承Runnable接口的实现类
无论使用Runnable还是Thread,都会new Thread,然后执行run方法
通过这里也可以知道创建新执行的线程有两种方法
- 声明为 Thread 的子类,重写 Thread 类的 run 方法。创建对象,开启线程。run方法相当于其他线程的main方法。
- 声明一个实现 Runnable 接口的类,实现run方法,创建对象,开启线程。
public class Thread implements Runnable {
/* Make sure registerNatives is the first thing <clinit> does. */
private static native void registerNatives();
static {
registerNatives();
}
private volatile String name;
private int priority;
/* Whether or not the thread is a daemon thread. */
private boolean daemon = false;
/* Interrupt state of the thread - read/written directly by JVM */
private volatile boolean interrupted;
/* Fields reserved for exclusive use by the JVM */
private boolean stillborn = false;
private long eetop;
/* What will be run. */
private Runnable target;
/* The group of this thread */
private ThreadGroup group;
/* The context ClassLoader for this thread */
private ClassLoader contextClassLoader;
/* The inherited AccessControlContext of this thread */
private AccessControlContext inheritedAccessControlContext;
/* For autonumbering anonymous threads. */
private static int threadInitNumber;
属性值比较多
主要常用的属性代表是
- name为Thread的名字,通过Thread类的构造函数来指定线程名字
- priority表示线程的优先级(1-10,越大的数字优先级越高,默认值为5)
- daemon表示线程是否是守护线程
- target表示要执行的任务
1.1 线程属性方法
用来得到线程IDgetId
得到线程名称getName
设置线程名称setName
获取线程优先级getPriority
设置线程优先级setPriority
设置线程属性,可为守护线程和判断线程setDaemon
判断是否是守护线程isDaemon
具体的用户线程和守护线程区别
可查看我之前的一篇文章补补细节
【操作系统】线程与进程的深入剖析(全)
2. 常用方法
常用的方法有start、run和sleep方法
- start方法:使该线程开始执行,jvm开始调用run方法。在该过程中,会为相应的线程分配所需要的资源
- run方法:该线程要执行的操作,不是用户自身调用,是start的启动后自动调用。如果继承Thread类必须重写run方法,在run方法中定义具体要执行的任务
- sleep方法:指定毫秒数让当前正在执行的线程休眠,但sleep不会释放锁
sleep(long millis) //参数为毫秒
sleep(long millis,int nanoseconds) //第一参数为毫秒,第二个参数为纳秒
3. 使用方法
1. 通过调用自带的线程
Thread mt = new Thread("新的线程!");
//开启新线程
mt.setDaemon();
mt.start();
//在主方法中执行for循环
for (int i = 0; i < 10; i++) {
System.out.println("main线程!" + i);
}
结果如图所示
![在这里插入图片描述](https://img-blog.csdnimg.cn/6758dbf683f8441eb9ecf547615a05c8.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Nzg3MjI4OA==,size_16,color_FFFFFF,t_70)
2.通过继承Thread,重写方法
public class MyThread extends Thread {
//定义指定线程名称的构造方法
public MyThread(String name) {
//调用父类的String参数的构造方法,指定线程的名称
super(name);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName()+":正在执行!"+i);
}
}
}