?? threaddemo.java
字號:
/** 主方法main()是java解釋器調用的初始方法,它定義和同時啟動了第二個
* 和第三個進程。類ThreadDemo繼承了類Thread,重載了類Thread的方法run()
*/
public class ThreadDemo extends Thread {
/** 這里重載了類Thread的方法run(),它定義了這個線程的執行代碼
*/
public void run() {
for (int i = 0; i < 5; ++i)
compute();
}
/** 除了解釋器調用main()時創建的初始進程外,main()創建和啟動了
* 兩個進程
*/
public static void main(String[] args) {
// 創建第一個線程:一個這個類的實例。上面定義的方法run()
// 定義了這個線程的執行代碼
ThreadDemo thread1 = new ThreadDemo();
// 通過傳遞一個Runnable類的實例給類Thread的構造函數來
// 創建第二個線程。下面類Runnable的匿名實例的方法run()
// 定義了這個線程的執行代碼
Thread thread2 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 5; ++i) compute();
}
});
// 通過main()的參數對線程的優先級進行設定
if (args.length >= 1)
thread1.setPriority(Integer.parseInt(args[0]));
if (args.length >= 2)
thread2.setPriority(Integer.parseInt(args[1]));
// 啟動這兩個線程
thread1.start();
thread2.start();
// main()運行在解釋器創建的初始線程中,現在,這個線程
// 也做一些工作
for (int i = 0; i < 5; ++i)
compute();
// 運行到下面的代碼,我們將等待著線程的運行結束。但是
// 這些代碼并不是必要的,所以我們將它們注釋掉了。
// try {
// thread1.join();
// thread2.join();
// }
// catch (InterruptedException e) {}
// 僅僅當所有的線程都停止運行,主方法main()返回時,
// java虛擬機才退出。
}
// 類ThreadLocal的實例用來記錄一個數值,這個數值可以通過
// 方法get()和set()來獲得和設置。但是對不同的線程,它們
// 記錄一個不同的數值。這個實例跟蹤每個線程調用方法compute()
// 的次數
static ThreadLocal numcalls = new ThreadLocal();
/** 這是我們所有的線程都調用的模型函數 */
static synchronized void compute() {
// 計算出已經被當前線程調用的次數
Integer n = (Integer)numcalls.get();
if (n == null)
n = new Integer(1);
else
n = new Integer(n.intValue()+1);
numcalls.set(n);
// 顯示線程的名字和調用的次數
System.out.println(Thread.currentThread().getName()+": "+n);
// 做一個長時間的計算,模擬一個有限次計算的線程
for (int i = 0, j = 0; i < 1000000; ++i)
j += i;
// 同樣的,我們可以通過使線程休眠一段任意的時間來模擬一個
// 線程因為網絡或者I/O操作的延遲
try {
Thread.sleep((int)(Math.random()*100+1));
}
catch(InterruptedException e) {}
// 每一個線程都客氣的給其它線程提供運行的機會,這是很
// 重要的,可以保證一個線程不會使同等優先級的線程餓死
Thread.yield();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -