1.sleepwait的区别?

    1.sleep必须指定时间,wait可以指定可以不指定。

    2.sleepwait都可以让线程处于冻结状态,释放执行权。(相同点)

    3.持有锁的线程执行sleep,不释放锁,持有锁的线程执行到wait释放锁。

    4.sleep到时间会自动醒,wait没有指定时间,只能被其他线程通过notify唤醒。


2.如何让线程走向消亡

    一是线程的任务没了,二是stop()是强制停止线程,但是会有风险.java提供的两种方法

    1.线程任务中定义循环语句:只要定义变量控制住循环。就可以控制线程的结束

    2.interrupt方法

class StopThread implements Runnable{
    private boolean flag = true;
     
    public void run (){
    /*
        线程任务中必然需要定义循环语句。
        只要定义变量控制住循环。就可以控制线程的结束。
        */
        while(flag){
            System.out.println(Thread.currentThread().getName()+"......run");
        }
    } 
    public void setFlag(){
        flag = false;
    }
     
}
     
class StopThreadDemo {
    public static void main(String[] args) {
    StopThread st = new StopThread();
     
    Thread t1 = new Thread(st);
    Thread t2 = new Thread(st);
    t1.start();
    t2.start();
     
    int num = 0;
     
    while(true){
        if(num++ == 50){
            st.setFlag();//当条件满足时,将线程任务中的标记改为false。让线程停止。
            break;
        }
        System.out.println(Thread.currentThread().getName()+"....."+num);
        }
        System.out.println("over");
    }
}


class StopThread implements Runnable{
    private boolean flag = true;
    public synchronized void run (){
    while(flag){
        try{
            wait();    
             //如果线程被等待很长时间,是无法继续判断标记的,线程并没有停下来。
        }
        catch (InterruptedException e){
            System.out.println(Thread.currentThread().getName()+".....Exception");
            flag = false;
        }
            System.out.println(Thread.currentThread().getName()+"......run");
        }
    }
     
    public void setFlag(){
        flag = false;
    } 
}
 
 
 
class StopThreadDemo{
    public static void main(String[] args){
        StopThread st = new StopThread();
         
        Thread t1 = new Thread(st);
        Thread t2 = new Thread(st);
        t1.start();
        t2.start();
        int num = 0;
         
        while(true){
            if(num++ == 50){
                //对t1进行一次中断,意思是将t1的冻结状态清除。让其恢复执行资格。
                t1.interrupt();
                t2.interrupt();
                break;
            }
            System.out.println(Thread.currentThread().getName()+"....."+num);
        } 
        System.out.println("over");
    }
}


不是所有的程序能用的notify(),  interrupt()是强制清除等待状态。


3.setDaemon

public final void setDaemon(boolean on)

将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,也就是没有前台线程运行的时候,Java 虚拟机退出。

调用该方法必须在启动线程前调用。

class StopThreadDemo {
    public static void main(String[] args) {
        StopThread st = new StopThread();
         
        Thread t1 = new Thread(st);
        Thread t2 = new Thread(st);
        t1.start();
         
        t2.setDaemon(true);//将t2标记成守护线程(后台线程)
        t2.start();
        int num = 0;
         
        while(true){
            if(num++ == 50){
                //对t1进行一次中断,意思是将t1的冻结状态清除。让其恢复执行资格。
                t1.interrupt();
                break;
            }
            System.out.println(Thread.currentThread().getName()+"....."+num);
        }
         
        System.out.println("over");
    }
}

多线程-方法介绍_多线程

Thread-1不论处于什么状态,都会自动停止。

4.join

public final void join() throws InterruptedException

等待该线程终止。

 

class Demo implements Runnable{
    private String name;
    Demo(String name){
        this.name = name;
    }
    public void run(){
        for(int x=0; x<20; x++){
            System.out.println(Thread.currentThread().getName()+"...."+x+"...."+name);
        }
    }
}
     
     
class ThreadDemo_Join {
    public static void main(String[] args) throws Exception{
        Demo d1  = new Demo("小强");
        Demo d2  = new Demo("旺财");
         
        Thread t1 = new Thread(d1);
        Thread t2 = new Thread(d2);
         
        t1.start();
        t1.join();  
        //主线程等待t1线程终止。主线程立刻释放执行权,没了执行资格,等t1执行终止后,主线程再继续执行
        t2.start();
        //t1.join();
        //放在这行,cpu从执行t2切换到执行t1.join()的时候.这时候,t2和main都要等t1结束了
        
        for(int x=0; x<20; x++){
            System.out.println("main......"+x);
        }
    }
}


5.setPriority(int newPriority) 

更改线程的优先级

优先级用数字来标识,1-10,数字越大,获取cpu执行权频率越高。

    


6.yield() 

暂停当前正在执行的线程对象,并执行其他线程