1:sleep()
sleep()方法属于Thread类,主要的作用是让当前线程停止执行,把cpu让给其他线程执行,但不会释放对象锁和监控的状态,到了指定时间后线程又会自动恢复就绪状态;
注意:线程睡眠到期自动苏醒,并返回到可运行状态,不是运行状态。sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始执行;
public class Demo4 extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if(i==4){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(i +"--"+ System.currentTimeMillis() + "--"+Thread.currentThread().getName());
}
}
}
class TestDemo4{
public static void main(String[] args) {
Demo4 t1 = new Demo4();
t1.start();
Demo4 t2 = new Demo4();
t2.start();
}
}
2:join()
让线程按顺序执行。
如果没有join方法,异步执行;
public class Demo5 extends Thread {
@Override
public void run() {
System.out.println("run");
}
}
class TestDemo5{
public static void main(String[] args) throws InterruptedException {
System.out.println("start");
Demo5 t1 = new Demo5();
t1.start();
System.out.println("end");
}
}
如果想改为同步执行;只需要添加join()
问题:有线程 t1 、t2 、t3 ,如何让线程安装顺序 t1–>t2–>t3 执行?
public class Demo5 extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(i+"--"+Thread.currentThread().getName());
}
}
}
class TestDemo5{
public static void main(String[] args) throws InterruptedException {
Demo5 t1=new Demo5();
t1.start();
t1.join();
Demo5 t2=new Demo5();
t2.start();
t2.join();
Demo5 t3=new Demo5();
t3.start();
t3.join();
}
}
3:yield()
一个线程调用yield()意味着告诉虚拟机自己非常乐于助人,可以把自己的位置让给其他线程(这只是暗示,并不表绝对)。但得注意,让出cpu并不代表当前线程不执行了。当前线程让出cpu后,还会进行cpu资源的争夺,但是能不能再次分配到,就不一定了;
public class Demo6 extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if(i == 2){
this.yield();
}
System.out.println(i+"--"+Thread.currentThread().getName());
}
}
}
class TestDemo6{
public static void main(String[] args) {
Demo6 t1 = new Demo6();
Demo6 t2 = new Demo6();
t1.start();
t2.start();
}
}
4:isAlive()
判断线程是否处于活动状态。
如果是活动状态返回true,死亡状态返回false;
public class Demo6 extends Thread {
@Override
public void run() {
System.out.println("3"+this.isAlive());
}
}
class TestDemo6{
public static void main(String[] args) throws InterruptedException {
Demo6 t1 = new Demo6();
System.out.println("1"+t1.isAlive());
t1.start();
System.out.println("2"+t1.isAlive());
}
}
5:getName()和setName()
获取线程名和设置线程名
public class Demo6 extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());//获取线程名
}
}
class TestDemo6{
public static void main(String[] args) throws InterruptedException {
Demo6 t1 = new Demo6();
t1.setName("t1");//设置线程名
Demo6 t2 = new Demo6();
t2.setName("t2");
t1.start();
t2.start();
}
}
6:getPriority()和setPriority()
用来获取和设置线程优先级。
1:记住当线程的优先级没有指定时,所有线程都携带普通优先级。
2:优先级可以用从1到10的范围指定。10表示最高优先级,1表示最低优先级,5是普通优先级。
3:记住优先级最高的线程在执行时被给予优先。但是不能保证线程在启动时就进入运行状态。:由调度程序决定哪一个线程被执行。
4:t.setPriority()用来设定线程的优先级。
5:记住在线程开始方法被调用之前,线程的优先级应该被设定。
6:你可以使用常量,如MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY来设定优先级。