wait和sleep的区别
- wait和sleep都会释放CPU的执行权,但是wait会释放锁,而sleep不会释放锁
- wait可以没有时间参数,让线程永远休眠
线程的结束
- 通过循环标记
这种情况简单易懂
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();
}
}