sleep方法:释放cpu资源,但是不会释放锁; yeild方法:释放cpu的资源,但是会保留cpu的执行资格;()
public class YeildTest {
//yeild方法的含义就是线程释放cpu的执行权限,但是依旧保留竞争cpu的资格
public static int COUNT1 = 0;
public static int COUNT2 = 0;
public static void add1(){
System.out.println(Thread.currentThread().getName() + ":" + COUNT1++);
}
public static void add2(){
System.out.println(Thread.currentThread().getName() + ":" + COUNT2++);
}
public static void main(String[] args) {
new Thread(() -> {
for (int i = 0; i < 1000; i++) {//由于线程1在执行的时候使用了yield方法,导致大部分的机会都给了线程2,所以最后的结果是
//t2连续出现的次数比他出现的多;
add1();
Thread.yield();
}
}, "t1").start();
new Thread(()->{
for (int i = 0; i < 1000; i++) {
add2();
}
},"t2").start();
}
//和线程有关的常见方法:
/**
*Thread类的静态方法:sleep,yield方法。
* Thread的实例方法即线程t1的方法:join(),
* Object对象的成员方法:wait(),notify(),notifAll(),wait(2)这几种常见的方法
*
* 这就是为什么每个对象都存在这样的几个方法,在于锁的对象就是每一个实例,而线程的wait与notify就是通过锁来调用的;
*
*
* 1.常见的问题包括:sleep,wait,yield方法的区别是什么?
* 答:sleep,wait方法都会释放cpu的计算资源,但是wait会释放锁资源,释放后其余的线程可以释放自己的锁,但是sleep不会释放自己占用的锁。
* yield方法表示的让步,即使当前的线程得到了CPU资源,也会让出cpu资源,但是会保留cpu的竞争资格与其他的线程竞争。
*
* 2.notify(),notifyAll()的区别?
*/
}
interrupt方法:首先它是属于线程实例的方法,所以使用t1来调用此方法;
package com.ydlclass.lock;
public class InterruptTest {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
System.out.println("开始了");
try {
Thread.sleep(60000);//interrupt方法打断的是wait方法和sleep方法,对与循环那种是不会打断的。
//运行过程不可以被打断,但是阻塞过程可以被打断。
} catch (InterruptedException e) {
System.out.println("我还没睡醒");
e.printStackTrace();
}
System.out.println("end了");
});
t1.start();
Thread.sleep(2000);
t1.interrupt();//在主线程中使用这个方法来打断一下,
}
/**
* 开始了
* java.lang.InterruptedException: sleep interrupted
* at java.base/java.lang.Thread.sleep(Native Method)
* at com.ydlclass.lock.InterruptTest.lambda$main$0(InterruptTest.java:8)
* at java.base/java.lang.Thread.run(Thread.java:834)
* end了
*/
}