Java线程问题 Java线程问题

java\u7ebf\u7a0b\u95ee\u9898\uff1a\u600e\u6837\u591a\u6b21\u6267\u884c

public class NumberPrintDemo {// n\u4e3a\u5373\u5c06\u6253\u5370\u7684\u6570\u5b57private static int n = 1;// state=1\u8868\u793a\u5c06\u7531\u7ebf\u7a0b1\u6253\u5370\u6570\u5b57, state=2\u8868\u793a\u5c06\u7531\u7ebf\u7a0b2\u6253\u5370\u6570\u5b57, state=3\u8868\u793a\u5c06\u7531\u7ebf\u7a0b3\u6253\u5370\u6570\u5b57private static int state = 1;public static void main(String[] args) { final NumberPrintDemo pn = new NumberPrintDemo(); new Thread(new Runnable() { public void run() { // 3\u4e2a\u7ebf\u7a0b\u6253\u537075\u4e2a\u6570\u5b57, \u5355\u4e2a\u7ebf\u7a0b\u6bcf\u6b21\u6253\u53705\u4e2a\u8fde\u7eed\u6570\u5b57, \u56e0\u6b64\u6bcf\u4e2a\u7ebf\u7a0b\u53ea\u9700\u6267\u884c5\u6b21\u6253\u5370\u4efb\u52a1. 3*5*5=75 for (int i = 0; i < 5; i++) { // 3\u4e2a\u7ebf\u7a0b\u90fd\u4f7f\u7528pn\u5bf9\u8c61\u505a\u9501, \u4ee5\u4fdd\u8bc1\u6bcf\u4e2a\u4ea4\u66ff\u671f\u95f4\u53ea\u6709\u4e00\u4e2a\u7ebf\u7a0b\u5728\u6253\u5370 synchronized (pn) { // \u5982\u679cstate!=1, \u8bf4\u660e\u6b64\u65f6\u5c1a\u672a\u8f6e\u5230\u7ebf\u7a0b1\u6253\u5370, \u7ebf\u7a0b1\u5c06\u8c03\u7528pn\u7684wait()\u65b9\u6cd5, \u76f4\u5230\u4e0b\u6b21\u88ab\u5524\u9192 while (state != 1) try { pn.wait(); } catch (InterruptedException e) { e.printStackTrace(); } // \u5f53state=1\u65f6, \u8f6e\u5230\u7ebf\u7a0b1\u6253\u53705\u6b21\u6570\u5b57 for (int j = 0; j < 5; j++) { // \u6253\u5370\u4e00\u6b21\u540en\u81ea\u589e System.out.println(Thread.currentThread().getName() + ": " + n++); } System.out.println(); // \u7ebf\u7a0b1\u6253\u5370\u5b8c\u6210\u540e, \u5c06state\u8d4b\u503c\u4e3a2, \u8868\u793a\u63a5\u4e0b\u6765\u5c06\u8f6e\u5230\u7ebf\u7a0b2\u6253\u5370 state = 2; // notifyAll()\u65b9\u6cd5\u5524\u9192\u5728pn\u4e0await\u7684\u7ebf\u7a0b2\u548c\u7ebf\u7a0b3, \u540c\u65f6\u7ebf\u7a0b1\u5c06\u9000\u51fa\u540c\u6b65\u4ee3\u7801\u5757, \u91ca\u653epn\u9501. // \u56e0\u6b643\u4e2a\u7ebf\u7a0b\u5c06\u518d\u6b21\u7ade\u4e89pn\u9501 // \u5047\u5982\u7ebf\u7a0b1\u6216\u7ebf\u7a0b3\u7ade\u4e89\u5230\u8d44\u6e90, \u7531\u4e8estate\u4e0d\u4e3a1\u62163, \u7ebf\u7a0b1\u6216\u7ebf\u7a0b3\u5c06\u5f88\u5feb\u518d\u6b21wait, \u91ca\u653e\u51fa\u521a\u5230\u624b\u7684pn\u9501. // \u53ea\u6709\u7ebf\u7a0b2\u53ef\u4ee5\u901a\u8fc7state\u5224\u5b9a, \u6240\u4ee5\u7ebf\u7a0b2\u4e00\u5b9a\u662f\u6267\u884c\u4e0b\u6b21\u6253\u5370\u4efb\u52a1\u7684\u7ebf\u7a0b. // \u5bf9\u4e8e\u7ebf\u7a0b2\u6765\u8bf4, \u83b7\u5f97\u9501\u7684\u9053\u8def\u4e5f\u8bb8\u662f\u66f2\u6298\u7684, \u4f46\u524d\u9014\u4e00\u5b9a\u662f\u5149\u660e\u7684. pn.notifyAll(); } } } }, "\u7ebf\u7a0b1").start(); new Thread(new Runnable() { public void run() { for (int i = 0; i < 5; i++) { synchronized (pn) { while (state != 2) try { pn.wait(); } catch (InterruptedException e) { e.printStackTrace(); } for (int j = 0; j < 5; j++) { System.out.println(Thread.currentThread().getName() + ": " + n++); } System.out.println(); state = 3; pn.notifyAll(); } } } }, "\u7ebf\u7a0b2").start(); new Thread(new Runnable() { public void run() { for (int i = 0; i < 5; i++) { synchronized (pn) { while (state != 3) try { pn.wait(); } catch (InterruptedException e) { e.printStackTrace(); } for (int j = 0; j < 5; j++) { System.out.println(Thread.currentThread().getName() + ": " + n++); } System.out.println(); state = 1; pn.notifyAll(); } } } }, "\u7ebf\u7a0b3").start(); } }

\u7a0b\u5e8f\u8fd0\u884c\u90fd\u4f1a\u7533\u8bf7CPU\u8d44\u6e90\uff0c\u7531\u4e8eCPU\u7684\u5355\u4f4d\u65f6\u95f4\u7cbe\u786e\u5230\u7eb3\u79d2\uff0c\u6240\u4ee5\u6211\u4eec\u770b\u8d77\u6765cpu\u53ef\u4ee5\u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5904\u7406\u591a\u4e2a\u7ebf\u7a0b\uff0c\u4f46\u5b9e\u9645\u4e0a\u5355\u4f4d\u65f6\u95f4\u5185cpu\u53ea\u80fd\u5904\u7406\u4e00\u4e2a\u7ebf\u7a0b\uff0c\u4f7f\u7528\u7ebf\u7a0b\u7684sleep()\u65b9\u6cd5\u5c31\u53ef\u4ee5\u628a\u8be5\u7ebf\u7a0b\u5360\u6709\u7684cpu\u8d44\u6e90\u8ba9\u51fa\u6765\u4ea4\u7ed9\u5176\u4ed6\u7ebf\u7a0b\u4f7f\u7528\u3002

线程只能调用一次start方法,这将使线程进入待运行状态,等待分配CPU时间片。在线程中的run方法执行完毕后,线程进入死亡状态,该线程生命结束。一个线程对象只可以调用一次start方法。试图在线程死亡后再次调用start方法将抛出IllegalThreadStateException异常。

线程运行完后就释放对了,不能再次运行start方法

  • java绾跨▼闂
    绛旓細鍦ㄥ吀鍨嬬殑Java闈㈣瘯涓紝 闈㈣瘯瀹樹細浠绾跨▼鐨勫熀鏈蹇甸棶璧, 濡傦細涓轰粈涔堜綘闇瑕佷娇鐢ㄧ嚎绋嬶紝 濡備綍鍒涘缓绾跨▼锛岀敤浠涔堟柟寮忓垱寤虹嚎绋嬫瘮杈冨ソ锛堟瘮濡傦細缁ф壙thread绫昏繕鏄皟鐢≧unnable鎺ュ彛锛夛紝鐒跺悗閫愭笎闂埌骞跺彂闂鍍忓湪Java骞跺彂缂栫▼鐨勮繃绋嬩腑閬囧埌浜嗕粈涔堟寫鎴橈紝Java鍐呭瓨妯″瀷锛孞DK1.5寮曞叆浜嗗摢浜涙洿楂橀樁鐨勫苟鍙戝伐鍏凤紝骞跺彂缂栫▼甯哥敤鐨勮璁...
  • Java澶绾跨▼闂鎬荤粨?
    绛旓細璇曟兂锛屽鏋滃崟鏍窩PU浣跨敤鍗绾跨▼锛岄偅涔堝彧瑕佽繖涓嚎绋嬮樆濉炰簡锛屾瘮鏂硅杩滅▼璇诲彇鏌愪釜鏁版嵁鍚э紝瀵圭杩熻繜鏈繑鍥炲張娌℃湁璁剧疆瓒呮椂鏃堕棿锛岄偅涔堜綘鐨勬暣涓▼搴忓湪鏁版嵁杩斿洖鍥炴潵涔嬪墠灏卞仠姝㈣繍琛屼簡銆傚绾跨▼鍙互闃叉杩欎釜闂锛屽鏉$嚎绋嬪悓鏃惰繍琛岋紝鍝曚竴鏉$嚎绋嬬殑浠g爜鎵ц璇诲彇鏁版嵁闃诲锛屼篃涓嶄細褰卞搷鍏跺畠浠诲姟鐨勬墽琛屻傦紙3锛変究浜庡缓妯 杩欐槸...
  • java浣跨敤绾跨▼鐨闂?
    绛旓細浠ヤ笂骞跺彂鏈嶅姟鍣ㄥ湪鏌愪竴鐬棿鐢卞悓涓鏈嶅姟鍣ㄨ繘绋嬫墍浜х敓鐨勫涓苟鍙绾跨▼瀵瑰涓鎴风殑骞跺彂璇锋眰閲囧彇鍒嗚屾不涔嬬殑鎺柦,浠庤岃В鍐充簡骞跺彂璇锋眰鐨闂銆傚悇绾跨▼鍗冲彲浠ョ嫭绔嬫搷浣,鍙堝彲浠ュ崗鍚屼綔涓氥傞檷浣庝簡鏈嶅姟鍣ㄧ殑澶嶆潅搴︺Java鏄熀浜庢搷浣滅郴缁熺骇鐨勫绾跨▼鐜涔嬩笂璁捐鐨勶紝Java鐨勮繍琛屽櫒渚濋潬澶氱嚎绋嬫潵鎵ц浠诲姟锛屽苟涓旀墍鏈夌被搴撳湪璁捐鏃堕兘鑰...
  • java+澶绾跨▼寮傛鍫嗘爤瀹為獙涓彲鑳藉嚭鐜扮殑闂?
    绛旓細绾跨▼瀹夊叏闂锛氱敱浜庡绾跨▼鍚屾椂鎿嶄綔鍏变韩鐨勬暟鎹粨鏋勶紝鍙兘浼氬鑷存暟鎹珵浜夊拰涓嶄竴鑷寸殑缁撴灉銆傞渶瑕佷娇鐢ㄥ悓姝ユ満鍒讹紙濡傞攣銆佷俊鍙烽噺銆佸師瀛愬彉閲忕瓑锛夋潵淇濊瘉绾跨▼瀹夊叏銆2. 姝婚攣闂锛氬鏋滃涓嚎绋嬬浉浜掔瓑寰呭鏂归噴鏀鹃攣锛屽氨浼氬舰鎴愭閿併傞渶瑕侀伩鍏嶅嚭鐜拌繖绉嶆儏鍐碉紝鍙互浣跨敤閬垮厤姝婚攣鐨勭畻娉曟垨鑰呰璁″悎鐞嗙殑閿佺珵浜夌瓥鐣ャ3. 鍐呭瓨娉勬紡闂锛...
  • Java绾跨▼闂
    绛旓細绾跨▼鍙兘璋冪敤涓娆tart鏂规硶锛岃繖灏嗕娇绾跨▼杩涘叆寰呰繍琛岀姸鎬侊紝绛夊緟鍒嗛厤CPU鏃堕棿鐗囥傚湪绾跨▼涓殑run鏂规硶鎵ц瀹屾瘯鍚庯紝绾跨▼杩涘叆姝讳骸鐘舵侊紝璇ョ嚎绋嬬敓鍛界粨鏉熴備竴涓嚎绋嬪璞″彧鍙互璋冪敤涓娆tart鏂规硶銆傝瘯鍥惧湪绾跨▼姝讳骸鍚庡啀娆¤皟鐢╯tart鏂规硶灏嗘姏鍑篒llegalThreadStateException寮傚父銆
  • java 绾跨▼闂
    绛旓細java涓绾跨▼鎻忚堪鐨勭被鏄痡ava.lang.Thread銆傚垱寤虹嚎绋嬫湁涓ょ鏂瑰紡锛1.瀹氫箟涓涓被缁ф壙Thread銆傝繖涓被闇瑕佸鍐欑埗绫荤殑run鏂规硶锛岀嚎绋嬪惎鍔ㄦ椂浼氳嚜鍔ㄨ皟鐢╮un鏂规硶銆傚垱寤篢hread鎴栧叾瀛愮被瀵硅薄绛変簬鍒涘缓浜嗕竴涓嚎绋嬶紝璋冪敤start()鏂规硶鍚姩杩欎釜绾跨▼锛屽惎鍔ㄧ嚎绋嬪悗浼氳嚜鍔ㄨ皟鐢╮un鏂规硶銆俆hread t = new Thread();//鍒涘缓涓涓嚎绋嬨
  • Java Swing澶绾跨▼姝婚攣闂瑙f瀽
    绛旓細鍦ㄥ熀浜Java Swing杩涜鍥惧舰鐣岄潰寮鍙戠殑鏃跺 缁忓父閬囧埌鐨勫氨鏄疭wing澶绾跨▼闂 鎴戜滑鍙互鎯虫兂涓涓 濡傛灉闇瑕佸湪涓涓浘褰㈢晫闈笂鏄剧ず寰堝鏁版嵁 杩欎簺鏁版嵁鏄粡杩囬暱鏃堕棿 澶嶆潅鐨勬煡璇㈠拰杩愮畻寰楀埌鐨 濡傛灉鍦ㄥ浘褰㈢晫闈㈢殑鍚屼竴涓嚎绋嬩腑杩涜鏌ヨ鍜岃繍绠楀伐浣滃垯浼氬鑷翠竴娈垫椂闂寸晫闈㈠浜庢鏈虹姸鎬 杩欎細缁欑敤鎴峰甫鏉ヤ笉鑹殑浜掑姩鎰熷彈 涓轰簡瑙e喅杩欎釜...
  • JAVA绋嬪簭璁捐,澶绾跨▼涓旈伩鍏嶆閿
    绛旓細鍒欒浠g爜灞傚彲浠ュ惎鍔ㄤ竴涓柊浜嬪姟骞堕噸鍋氬厛鍓嶆墍鏈夊伐浣溿傚綋鍑虹幇闂灏遍噸璇曪紝鐢变簬鏁版嵁搴撳彲浠ヨ嚜鐢卞湴鑾峰彇閿侊紝鎵浠ュ嚑涔庝笉鍙兘淇濊瘉涓や釜鎴栦袱涓互涓婄殑绾跨▼涓嶅彂鐢熸暟鎹簱姝婚攣銆傛鏂规硶鑷冲皯鑳戒繚璇佸湪鍑虹幇鏌愪簺鏁版嵁搴撴閿佹儏鍐垫椂锛屽簲鐢ㄧ▼搴忚兘姝e父杩愯銆(2)璧勬簮姹犺楀敖姝婚攣瀹㈡埛绔殑澧炲姞瀵艰嚧璧勬簮姹犺楀敖姝婚攣鏄敱浜庤礋杞借岄犳垚鐨勶紝...
  • JAVA绾跨▼闂
    绛旓細//Thread瀵硅薄鐨刧etName杩斿洖褰撳墠璇绾跨▼鐨勫悕瀛 System.out.println(getName() + " " + i);} } public static void main(String[] args){ for (int i = 0; i < 100; i++){ //璋冪敤Thread鐨刢urrentThread鏂规硶鑾峰彇褰撳墠绾跨▼ System.out.println(Thread.currentThread().getName() + " " ...
  • java 鍏充簬绾跨▼鐨闂
    绛旓細sleep()锛歍hread绫绘柟娉曪紝鐢ㄦ潵鎺у埗鑷韩娴佺▼銆倃ait()锛歄bject绫绘柟娉曪紝璋冪敤姝ゆ柟娉曟椂锛岃璋冨璞¤繘鍏ョ瓑寰呯姸鎬侊紝鐩村埌琚敜閱掓垨绛夊緟鏃堕棿鍒般俷otify()锛氬敜閱掍竴涓鍦ㄧ瓑寰呰瀵硅薄鐨绾跨▼銆俷otifyAll()锛氬敜閱掓墍鏈夋鍦ㄧ瓑寰呰瀵硅薄鐨勭嚎绋嬨傚紓甯革細wait(),notify()锛java.lang.IllegalMonitorStateException銆倃ait(),sleep()锛...
  • 扩展阅读:java线程和进程区别 ... java四种线程池 ... java线程安全问题 ... java多态 ... java 线程面试题 ... java线程池的七个参数 ... javascript入门 ... java开启新线程 ... java技术面试常见问题 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网