您的位置:首页 > 其它

1.8.2挂起线程(独占锁)

2017-10-10 02:04 127 查看
package demo;

/**
* Created by sunyifeng on 17/10/10.
*/
public class SynObject {
synchronized public void printString(){
System.out.println("---开始---");
if (Thread.currentThread().getName().equals("a")) {
System.out.println("a线程永远挂起了");
Thread.currentThread().suspend();
}
System.out.println("---结束---");
}
}

package demo;

/**
* Created by sunyifeng on 17/10/10.
*/
public class Run {
public static void main(String[] args) {
try {
final SynObject synObject = new SynObject();
//
Thread thread1 = new Thread() {
@Override
public void run() {
synObject.printString();
}
};
thread1.setName("a");
thread1.start();
Thread.sleep(1000);
//
Thread thread2 = new Thread() {
@Override
public void run() {
System.out.println("线程2启动了");
synObject.printString();
}
};
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

运行结果:

---开始---

a线程永远挂起了

程序分析:

1、线程2没有打印内容,因为线程1将printString方法挂起;

2、程序没有执行完,没有打印出结束。

再看一个栗子。

package demo;

/**
* Created by sunyifeng on 17/10/10.
*/
public class MyThread extends Thread {
private long i = 0;
@Override
public void run(){
while (true) {
i++;
System.out.println(i);
}
}
}

package demo;

/**
* Created by sunyifeng on 17/10/10.
*/
public class Run {
public static void main(String[] args) {
try {
System.out.println("---开始---");
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(1000);
myThread.suspend();
System.out.println("---结束---");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

运行结果:

.......

244118

244119

244120

244121

程序分析:

打印方法println()是同步的,当程序运行到打印方法内部时,同步锁未释放,导致打印方法一直是“挂起”状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: