這兩天在研究多執行緒的使用方法,我們的需求是這樣的:程式啟動時,先讓子執行緒處於執行狀態,執行過程中會人為的更改該執行緒的執行狀態為掛起,等待隨機的時長之後,再把該執行緒重新喚醒,讓其繼續執行;人為掛起執行緒和恢復執行緒的次數也是隨機的。經過不懈努力,最終找到了如下壹個實現了 runnable 的執行緒類,完美解決該問題,記錄於此。首先是 mythread 執行緒類的定義:
public class mythread implements runnable
//啟動執行緒
public void start()
//掛起執行緒
public void suspend()
synchronized (this)
} //恢復執行緒
public void resume()
synchronized (this)
} //終止執行緒
public void stop()
synchronized (this)
} public void run()
if (waiting)
}// 應該做的事情
execute();
// 進入等待狀態
thread.sleep(50);
} catch (interruptedexception e)
} }//真正要做的事情
private void execute()
}}
上述**中,mythread 類提供了四個 public 的方法,分別是 start(),suspend(),resume(),stop(),分別完成啟動執行緒,掛起執行緒,恢復執行緒,終止執行緒的功能,程式通過兩個布林型變數控制子執行緒 thread 的狀態:waiting 和 running,彼此之間配合堪稱天衣無縫, 多執行緒果然強大。
接下來是呼叫該執行緒類的測試**:
public class main catch (interruptedexception e)
}}
該類執行之後的輸出結果為:
--- start the subthread
test is running...
test is running...
test is running...
test is running...
test is running...
test is running...
test is running...
test is running...
test is running...
test is running...
test is running...
--- suspend the thread
--- main thread do something
--- resume the thread
test is running...
test is running...
test is running...
test is running...
test is running...
test is running...
test is running...
test is running...
test is running...
test is running...
--- end this thread
--- main thread do something
--- exit programe.
從輸出可以很容易的看出,從第13行開始,子執行緒被掛起之後,就不再執行 execute() 方法並列印字串了,等到第15行時主線程重新把它啟用之後,又開始繼續輸出字串了,到最後第26行主線程把子執行緒結束掉之後,它就不再執行了,之後主線程自行退出了,整個過程中,子執行緒的狀態按照我們的要求發生了數次改變,效果讓人滿意。
Java 多執行緒使用 執行緒的掛起與重新喚醒
這兩天在研究多執行緒的使用方法,我們的需求是這樣的 程式啟動時,先讓子執行緒處於執行狀態,執行過程中會人為的更改該執行緒的執行狀態為掛起,等待隨機的時長之後,再把該執行緒重新喚醒,讓其繼續執行 人為掛起執行緒和恢復執行緒的次數也是隨機的。經過不懈努力,最終找到了如下壹個實現了 runnable 的執...
多執行緒 Java多執行緒與併發
實現的方式主要有三種 執行緒的狀態 基本差別 最主要的本質區別 兩個概念 鎖池 假設執行緒a已經擁有了某個物件 不是類 的鎖,而其他執行緒b c想要呼叫這個物件的某個synchronized方法 或者塊 由於b c執行緒在進入物件的synchronized方法 或者塊 之前必須先獲得該物件鎖的擁有權...
java多執行緒使用
首先說一下多執行緒的應用場景吧 eg 1 2 3 1億 最開始測試用的是1兆,但是超過了double的範圍,計算的資料不準確,用bigdecimal太麻煩了 如何快速運算出資料結果 常規演算法 public static void main string args system.out.printl...