java多线程学习二

wait和sleep的区别

  1. wait和sleep都会释放CPU的执行权,但是wait会释放锁,而sleep不会释放锁
  2. wait可以没有时间参数,让线程永远休眠

线程的结束

  1. 通过循环标记
    这种情况简单易懂
package com.hfview.thread;

class Task implements Runnable {
    private boolean flag=true;
    public  void run() {
        while (flag) {
            System.out.println(Thread.currentThread().getName());
        }
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }

}

public class ThreadStop {

    public static void main(String[] args) throws InterruptedException {
        Task task =new Task();
        Thread t1 =new Thread(task);
        t1.start();
        for(int i=0;i<=50;i++){
            if(i==50){
                System.out.println(Thread.currentThread().getName()+".....................");
                task.setFlag(false);
            }
        }
    }
}

2.通过interrupt方法
第一种方式如果遇到wait(),则根部就不会读取到flag的值了,达不到要停止的目的
如果线程遇到受阻状态,interrupt让线程恢复到具有执行CPU资格的状态,具有强制性,比如wait需要notify才能唤醒,sleep需要过了特定时间才能唤醒,interrupt会强制线程恢复,所以这种方式会发生异常

package com.hfview.thread;

class Task2 implements Runnable {
    private boolean flag=true;
    public synchronized void run() {
        while (flag) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName());
        }
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }

}

public class ThreadStop2 {

    public static void main(String[] args) throws InterruptedException {
        Task2 task =new Task2();
        Thread t1 =new Thread(task);
        t1.start();
        for(int i=0;i<=50;i++){
            if(i==50){
                System.out.println(Thread.currentThread().getName()+".....................");

                /*加上这句话后,线程就发生了InterruptedException异常,说明跳出了wait*/
                t1.interrupt();

                /*如果不加下面这句话,那么程序会继续执行,然后会从新判断flag的值,这样线程又wait了,还是不会停掉*/
                //task.setFlag(false);
            }
        }
    }
}

一个多线程的实例

package com.hfview.thread;

/**
 *子线程先运行5次,接着主线程运行10次 这样循环5次
 *wait和notify必须卸载同步中,因为他们必须有锁来调用没有锁将会抛出异常而且wait的写法是固定的while中 
 *需要使用到的共同数据比或者共同算法如锁,以及业务方法可以封装到一个类上,锁上互斥的代码要写在资源类中
 *
 * @author zhw
 */

public class hreadDemo2 {

    public static void main(String[] args) {
        final Business business = new Business();
        final int loopCount = 5;

        // 子线程任务 循环5次 每次执行内部业务5次
        Thread t = new Thread(new Runnable() {
            public void run() {
                for (int i = 1; i <= loopCount; i++) {
                    business.sub(i);
                }
            }
        });
        t.start();

        // 主线程任务 循环5次 每次执行内部业务10次
        for (int i = 1; i <=loopCount; i++) {
            business.main(i);
        }
    }
}

class Business {
    public boolean flag = true;
    final int subCount = 5;
    final int mainCount = 10;

    public synchronized void sub(int num) {
        while (!this.flag) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for (int i = 0; i < subCount; i++) {
            System.out.println(Thread.currentThread().getName() + "  " + i
                    + "次   属于第" + num + "循环");
        }
        this.flag = false;
        this.notify();
    }

    public synchronized void main(int num) {
        while (this.flag) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for (int i = 0; i < mainCount; i++) {
            System.out.println(Thread.currentThread().getName() + "  " + i
                    + "次   属于第" + num + "循环");
        }
        this.flag = true;
        this.notify();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值