1. 线程sleep()休眠
1: sleep() 在线程进入休眠后,最重要的也行就是不会放弃当前monitor 锁的所有权Thread.sleep()指定当前线程进入休眠状态.
>2: 使用TimeUtil替代sleep(),使用上更优雅。
>3: sleep()会在指定时间内释放cpu资源。
package com.mxli.concurrent;
import java.util.concurrent.TimeUnit;
public class ThreadSleepDemo {
public static void main(String[] args) throws InterruptedException {
new Thread(){
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName()+"----休眠");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName()+"----主休眠");
}
}
Thread-0----休眠
main----主休眠
两个线程、分别休眠,休眠重要特性,在同步方法中或者有锁的时候,休眠不会放弃其monitor锁的所有权。
2.线程yield
yield属于一种启发式的方式、提醒调度器(cpu轮询)我资源放弃获取当前CPU资源、在资源不紧张的时候,一般都会被忽略
3.线程优先级别的设置
1: setPriority()设置线程有限级别1-10 10最大,1最小。默认为5
4.获取当前线程
1: Thread.currentThread().getId() 获取当前线程ID。
2: Thread.currentThread().getName() 获取当前线程名称。
5.线程interrupt
>1: Object.wait(),Thread.sleep(),Thread.join()使当前线程进入阻塞状态,另外一个线程调用被阻塞线程的interrupt()方法,可以打破阻塞、一旦线程阻塞被打断,则会抛出InterruptedException异常
package com.mxli.concurrent;
import java.util.concurrent.TimeUnit;
public class InterrupeDemo {
public static void main(String[] args) throws InterruptedException {
Thread t= new Thread(){
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(1);//
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(Thread.currentThread().getName()+"1");
}
}
};
t.start();
TimeUnit.MICROSECONDS.sleep(100);
t.interrupt();
System.out.println(Thread.currentThread().getName()+"2");
}
}
main2
Thread-01
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at com.mxli.concurrent.InterrupeDemo$1.run(InterrupeDemo.java:11)
并throws 出InterruptedException异常
2: isInterrupted() 在中断后,有复位操作
package com.mxli.concurrent;
import java.util.concurrent.TimeUnit;
public class InterrupeDemo {
public static void main(String[] args) throws InterruptedException {
Thread t= new Thread(){
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(isInterrupted()+"......interrupt 复位操作,为false");
}
}
};
t.start();
TimeUnit.MICROSECONDS.sleep(300);
System.out.println(t.isInterrupted()+"......此刻未进行中断操作,所以为false ");
t.interrupt();
System.out.println(t.isInterrupted()+"......此刻已经中断操作,所以为true ");
TimeUnit.MICROSECONDS.sleep(300);
System.out.println(t.isInterrupted()+"......未有任何中断,未false");
}
}
false......此刻未进行中断操作,所以为false
true......此刻已经中断操作,所以为true
false......interrupt 复位操作,为false
false......未有任何中断,未false
6.线程join
join属于可中断方法,join某个线程A,会使线程B进入Blocking状态,知道A完成任务,或者到达指定时间,
package com.mxli.concurrent;
public class JoinDemo {
public static void main(String[] args) throws InterruptedException {
Thread t1=new Thread("T1"){
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
Thread t2=new Thread("T2"){
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
Thread t3=new Thread("T3"){
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
t3.join();
}
}
T1
T2
T3
三个线程按照顺序执行、