版权声明:版权归 爱装逼的文艺小青年所有 https://blog.csdn.net/toyota_rav4/article/details/84843112
目录
suspend()可以暂停线程;resume()可以恢复线程;
suspend()可以暂停线程;resume()可以恢复线程;
package com.demo3;
public class MyThread extends Thread {
private int num = 0;
public int getNum() {
return num;
}
@Override
public void run() {
while (true) {
num++;
}
}
}
package com.demo3;
public class Run {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(100);
System.out.println(myThread.getNum());
Thread.sleep(100);
myThread.suspend();
System.out.println(myThread.getNum());
Thread.sleep(100);
System.out.println(myThread.getNum());
myThread.resume();
Thread.sleep(100);
System.out.println(myThread.getNum());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
12480242
36655774
36655774
65261619
分析:从结果可以看出,suspend可以让线程暂停,而resume可以让线程运行。
suspend()缺点:独占
package com.demo4;
public class MyObject {
synchronized public void printString(){
System.out.println("begin");
if (Thread.currentThread().getName().equals("a")) {
System.out.println("a线程被suspend了!");
Thread.currentThread().suspend();
}
System.out.println("end");
}
}
package com.demo4;
public class ThreadA extends Thread {
private MyObject myObject;
public ThreadA(MyObject myObject) {
this.myObject = myObject;
}
@Override
public void run() {
myObject.printString();
}
}
package com.demo4;
public class ThreadB extends Thread {
private MyObject myObject;
public ThreadB(MyObject myObject) {
this.myObject = myObject;
}
@Override
public void run() {
myObject.printString();
}
}
package com.demo4;
public class Run {
public static void main(String[] args) {
MyObject myObject = new MyObject();
ThreadA threadA = new ThreadA(myObject);
threadA.setName("a");
ThreadB threadB = new ThreadB(myObject);
threadB.setName("b");
threadA.start();
threadB.start();
}
}
运行结果:
begin
a线程被suspend了!
分析:suspend()导致a线程独占同步资源,线程b始终无法占有资源(调用printString())。
suspend()缺点:不同步
package com.demo5;
public class MyObject {
private String username = "1";
private String password = "11";
public void setUsernamePassword(String username , String password) {
this.username = username;
if (Thread.currentThread().getName().equals("a")) {
System.out.println("停止a线程");
Thread.currentThread().suspend();
}
this.password = password;
}
public void printString(){
System.out.println("username= " + username + "\n" + "password=" + password);
}
}
package com.demo5;
public class ThreadA extends Thread {
private MyObject myObject;
public ThreadA(MyObject myObject) {
this.myObject = myObject;
}
@Override
public void run(){
myObject.setUsernamePassword("a","aa");
}
}
package com.demo5;
public class ThreadB extends Thread {
private MyObject myObject;
public ThreadB(MyObject myObject) {
this.myObject = myObject;
}
@Override
public void run() {
myObject.printString();
}
}
package com.demo5;
public class Run {
public static void main(String[] args) {
try {
MyObject myObject = new MyObject();
ThreadA threadA = new ThreadA(myObject);
ThreadB threadB = new ThreadB(myObject);
threadA.setName("a");
threadB.setName("b");
threadA.start();
Thread.sleep(1000);
threadB.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
停止a线程
username= a
password=11