引言:
java中的Thread类的相关常用方法及构造器介绍
构造器
Thread()
创建新的Thread对象
Thread(String threadname)
创建线程并指定线程实例名
Thread(Runnable target)
指定创建线程的目标对象,它实现了Runnable接口中的run方法
Thread(Runnable target, String name)
指定创建线程的目标对象,它实现了Runnable接口中的run方法,并指定线程实例名
有关方法
void start()
启动线程,并执行对象的run()方法
run()
线程在被调度时执行的操作。通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中
void setName(String name)
设置该线程的名称
String getName()
获取当前线程的名字
static Thread currentThread()
静态方法,返回执行当前代码的线程。在Thread子类中就是this,通常用于主线程和Runnable实现类。
static void yield() 线程让步
- 释放当前cpu的执行权,但是还是有可能再次被分到执行权
- 暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程
- 若队列中没有同优先级的线程,忽略此方法
join()
- 当某个程序执行流中调用其他线程的 join() 方法时,调用线程将被阻塞,直到 join() 方法加入的 join 线程执行完为止
- 在线程a中调用线程b的join(),此时线程a就进入阻塞状态,直到线程b完全执行完以后,线程a才结束阻塞状态
- join()抛出InterruptedException异常
- 低优先级的线程也可以获得执行
static void sleep(long millitime)(指定时间:毫秒)
- 令当前活动线程在指定时间段内放弃对CPU控制,使其他线程有机会被执行,时间到后重排队。
- 抛出InterruptedException异常
- 在指定的millitime毫秒时间内,当前线程是阻塞状态。
stop()
强制线程生命期结束,不推荐使用,已过时
boolean isAlive()
返回boolean,判断线程是否还活着
线程的优先级
Thread类中的静态整形常量 public final static int
- MAX_PRIORITY:10
- MIN _PRIORITY:1
- NORM_PRIORITY:5 –>默认优先级
如何获取和设置当前线程的优先级:
- getPriority():获取线程的优先级
- setPriority(int p):设置线程的优先级
说明:高优先级的线程要抢占低优先级线程cpu的执行权。但是只是从概率上讲,高优先级的线程高概率的情况下被执行。并不意味着只有当高优先级的线程执行完以后,低优先级的线程才执行。
class HelloThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
try {
sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
String threadName = getName();//Thread.currentThread().getName()
int priority = getPriority();//Thread.currentThread().getPriority()
System.out.println(threadName + ":" + priority + ":" + i);
}
}
}
public HelloThread(String name) {
super(name);
}
}
public class ThreadMethodTest {
public static void main(String[] args) {
HelloThread h1 = new HelloThread("thread-1");
//设置分线程优先级
h1.setPriority(Thread.MAX_PRIORITY);
h1.start();
//主线程命名
Thread.currentThread().setName("主线程");
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
String threadName = Thread.currentThread().getName();
int priority = Thread.currentThread().getPriority();
System.out.println(threadName + ":" + priority + ":" + i);
}
if (i == 20) {
try {
h1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}