java Thread 线程
程使用详解
1.线程运行状态
new Thread().start()
新建 创建一个线程实例。runnable
处于可运行状态,等待获取cpu执行时间。running
运行中,获取到cpu分配的执行时间。dead
死亡状态,运行结束,异常,中断,线程任务执行结束。block
阻塞状态,被同步代码块,锁机制,IO阻塞。需要等待获取到锁。wait
等待,睡眠状态。主动睡眠一定时间或主动等待其他线程唤醒。
2.实现方式
- 通过继承
Thread
类。 - 实现
Runnable
接口,实现run方法。
java提供这两种实现方式,Thread
其实也是实现了Runnable
接口。java是单继承机制。
3.Thread主要方法和属性
-
priority
优先级 通过thread.setPriority();
方法设置该线程的优先级。每个线程都有一个优先级,具有更高优先级的线程是优先于优先级较低的线程执行。1-10 数值越高优先级越高。 -
start()
开启一个线程 -
Thread.sleep(long millis)
当前线程睡眠多少毫秒,交出cpu 进入阻塞状态 。但该方法不会释放锁,也就是说当前线程持有对某个对象的锁,其他线程无法访问这个对象。 -
Thread.yield()
交出CPU 进入就绪状态,等待再次获取Cpu执行时间。该方法同样不会释放锁,并且该方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。 -
join(),join(long millis),join(long millis,int nanoseconds)
加入到某个线程中。比如线程A执行过程中join线程B,如果是无参数,则线程A进入阻塞状态,等待线程B执行结束后继续执行。有参数 则等待相应的时间后继续执行。
4.守护线程与普通线程
setDaemon(boolean on)
创建守护线程
守护线程会依赖于创建它的线程,会随着创建他的线程死亡而死亡。
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + "开始执行");
Thread1 thread1 = new Thread1("守护线程");
thread1.setDaemon(true);
thread1.start();
System.out.println(Thread.currentThread().getName() + "结束执行");
}
static class Thread1 extends Thread {
public Thread1(String name) {
super(name);
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始执行");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "结束执行执行");
}
}
----打印---
main开始执行
main结束执行
守护线程开始执行
注意: 但如果创建守护线程的线程还创建了其他非守护线程,则会等到其他所有非守护线程运行结束才会自动停止。
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + "开始执行");
Thread1 thread1 = new Thread1("守护线程");
thread1.setDaemon(true);
thread1.start();
System.out.println(Thread.currentThread().getName() + "结束执行");
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始执行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "结束执行执行");
}
},"非守护线程").start();
}
static class Thread1 extends Thread {
public Thread1(String name) {
super(name);
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始执行");
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "执行中...");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread() + "结束执行执行");
}
}
---打印输出---
main开始执行
main结束执行
守护线程开始执行
守护线程执行中...
非守护线程开始执行
守护线程执行中...
Thread[非守护线程,5,main]结束执行执行
可以看出 当非守护线程结束后,守护线程也自动终止了。