——程式死鎖、中斷
阿新 • • 發佈:2019-01-06
1、程式死鎖
過多的同步有可能出現死鎖,死鎖的操作一般在程式執行的時候才有可能出現。
多執行緒要進行資源的共享,就需要同步,但同步過多,就可能造成死鎖。
程式中出現死鎖的一般原因就是在當前的同步方法中呼叫了其它物件的同步方法, 在我們程式設計時要注意避免這樣寫 。死鎖的發生的是不確定性的!
下面用一個程式演示,但不一定會這樣寫。
package com.xiaofeng.example;
/**
* 死鎖
* @author XiaoFeng1015
*/
public class ThreadDemo3 {
public static void main (String[] args) {
new DeadThread();
}
}
// 顧客類
class Customer{
public synchronized void say(Waiter w){
System.out.println("顧客說:先吃飯在買單!");
w.doService();
}
public synchronized void doService(){
System.out.println("同意了,買完單再吃飯!");
}
}
// 服務員
class Waiter{
public synchronized void say(Customer c){
System.out.println("服務員說:先買單再吃飯");
c.doService();
}
public synchronized void doService(){
System.out.println("同意了,吃完飯再買單!");
}
}
class DeadThread implements Runnable {
Customer c= new Customer();
Waiter w = new Waiter();
public DeadThread(){
new Thread(this).start();
w.say(c);
}
@Override
public void run() {
c.say(w);
}
}
執行結果:
2、程式中斷
停止一個執行緒,目前一些destroy()方法已經過時,可以使用中斷的方式停止程式。
在停止一個程式時,也需要一些準備工作。
package com.xiaofeng.example;
public class TheadDemo4 {
public static void main(String[] args) throws InterruptedException {
MyThread my = new MyThread();
Thread t1 = new Thread(my);
t1.start();
for (int i = 0; i < 10; i++) {
Thread.sleep(500);
}
// 當i=10;時,設定flag為false,中斷程式執行
my.flag = false;
}
static class MyThread implements Runnable {
// 用flag做中斷標記
public boolean flag;
public MyThread() {
flag = true;
}
@Override
public void run() {
int i = 0;
while (flag) {
System.out.println("i=" + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
}
}
}
}
執行結果:
未完持續…….
期待和大家的交流,謝謝嘍!!