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了
     */
}