java中线程的run()方法 java线程中的run方法什么时候调用

java\u4e2d\u7ebf\u7a0b\u7684run()\u65b9\u6cd5\u662f\u4ec0\u4e48\uff1f

\u4e0a\u9762\u51e0\u4e2a\u8bf4\u7684\u4e5f\u662f\u6211\u8981\u8bf4\u7684\u51e0\u70b9\uff0c

run() \u65b9\u6cd5\u662f\u4e0d\u7528\u53c2\u6570\u7684\uff0c\u4e0d\u7528\u4f20\u4ed6\u5c31\u4f1a\u77e5\u9053\u3002

\u56e0\u4e3a\u7ebf\u7a0b\u91cc\u8fb9\u5927\u591a\u90fd\u662f\u6b7b\u5faa\u73af\uff0c\u548c\u4e3b\u7ebf\u7a0b\u540c\u6b65\u8fd0\u884c\u3002\uff08\u5f53\u7136\u5b9e\u9645\u4e0d\u662f\u8fd9\u6837\u7684\u3002\u4f46\u53ef\u4ee5\u8fd9\u6837\u7406\u89e3\uff09

\u6bd4\u5982\uff1a\u5b9a\u4e49\u4e00\u4e2a\u7528\u4e8e\u8f6c\u6362\u72b6\u6001\u7684\u5c5e\u6027\u3002

static final int STATE_GAME_RUN = 0;
static final int STATE_GAME_OVER = 1;

int state;

run \u65b9\u6cd5\u91cc\u8fb9\u6709\u8fd9\u6837\u7684\uff1a
switch(state)
case STATE_GAME_RUN :
System.out.println("\u6e38\u620f\u8fdb\u884c\u4e2d");
break;
case STATE_GAME_OVER:
System.out.println("\u6e38\u620f\u7ed3\u675f");
break;

\u5f53\u4e3b\u7ebf\u7a0b\u91cc\u8fb9state\u6539\u53d8\u65f6\uff0c\u7ebf\u7a0b\u91cc\u8fb9\u9a6c\u4e0a\u5c31\u4f1a\u77e5\u9053\uff0c\u8fd8\u7528\u4f20

\u8c03\u7528start()\u65f6\u5f00\u542f\u7ebf\u7a0b\uff0c\u5f53\u8be5\u7ebf\u7a0b\u83b7\u53d6\u6267\u884c\u8d44\u6e90\u540e\u5c31\u5f00\u59cb\u6267\u884crun\u65b9\u6cd5\uff1b\u5c31\u662f\u591a\u7ebf\u7a0b\u4f1a\u7ade\u4e89\u8d44\u6e90\uff0c\u8c01\u83b7\u5f97\u8d44\u6e90\u8c01\u5c31\u6267\u884c\uff0c\u5c31\u662f\u8fd0\u884crun\u65b9\u6cd5

当一个线程调用它的start()方法后,虚拟机就会去调用这个线程中的run()方法。
如myThread是一个线程对象,调用myThread.start();后,当CPU轮到这个线程使用时,虚拟机就会去调用这个线程的run()方法。

上面几个说的也是我要说的几点,

run() 方法是不用参数的,不用传他就会知道。

因为线程里边大多都是死循环,和主线程同步运行。(当然实际不是这样的。但可以这样理解)

比如:定义一个用于转换状态的属性。

static final int STATE_GAME_RUN = 0;
static final int STATE_GAME_OVER = 1;

int state;

run 方法里边有这样的:
switch(state)
case STATE_GAME_RUN :
System.out.println("游戏进行中");
break;
case STATE_GAME_OVER:
System.out.println("游戏结束");
break;

当主线程里边state改变时,线程里边马上就会知道,还用传

run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;

package com.ljq.test;

public class ThreadTest {
    
    /**
     * 观察直接调用run()和用start()启动一个线程的差别 
     * 
     * @param args
     * @throws Exception
     */
    public static void main(String[] args){
        Thread thread=new ThreadDemo();
        //第一种
        //表明: run()和其他方法的调用没任何不同,main方法按顺序执行了它,并打印出最后一句
        //thread.run();
        
        //第二种
        //表明: start()方法重新创建了一个线程,在main方法执行结束后,由于start()方法创建的线程没有运行结束,
        //因此主线程未能退出,直到线程thread也执行完毕.这里要注意,默认创建的线程是用户线程(非守护线程)
        //thread.start();
        
        //第三种
        //1、为什么没有打印出100句呢?因为我们将thread线程设置为了daemon(守护)线程,程序中只有守护线程存在的时候,是可以退出的,所以只打印了七句便退出了
        //2、当java虚拟机中有守护线程在运行的时候,java虚拟机会关闭。当所有常规线程运行完毕以后,
        //守护线程不管运行到哪里,虚拟机都会退出运行。所以你的守护线程最好不要写一些会影响程序的业务逻辑。否则无法预料程序到底会出现什么问题
        //thread.setDaemon(true);
        //thread.start();
        
        //第四种
        //用户线程可以被System.exit(0)强制kill掉,所以也只打印出七句
        thread.start();
        System.out.println("main thread is over");
        System.exit(1);
    }
    
    public static class ThreadDemo extends Thread{
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println("This is a Thread test"+i);
            }
        }
    }
}


当一个线程调用它的start()方法后,虚拟机就会去调用这个线程中的run()方法。

线程执行时程序需要做的步骤,通过start()方法可以调用到run()

  • java涓嚎绋嬬殑run()鏂规硶
    绛旓細褰撲竴涓嚎绋嬭皟鐢ㄥ畠鐨剆tart()鏂规硶鍚庯紝铏氭嫙鏈哄氨浼氬幓璋冪敤杩欎釜绾跨▼涓鐨剅un()鏂规硶銆傚myThread鏄竴涓嚎绋嬪璞★紝璋冪敤myThread.start();鍚庯紝褰揅PU杞埌杩欎釜绾跨▼浣跨敤鏃讹紝铏氭嫙鏈哄氨浼氬幓璋冪敤杩欎釜绾跨▼鐨剅un()鏂规硶銆
  • Java涓嚎绋嬬殑start鏂规硶鍜run鏂规硶鐨勫尯鍒
    绛旓細1 start():鏍囧織鐫绾跨▼寮濮嬭繍琛 2 sleep():鏉ヨ嚜Thread 绫 锛屼細璁╃▼搴忚繘鍏ョ潯鐪犵姸鎬侊紝鍦ㄤ竴瀹氭椂闂村悗鑷姩杩愯锛屼笉浼氶噴鏀鹃攣褰撴椂涓旈渶瑕佹崟鑾峰紓甯革紝鏄潤鎬佹柟娉 3 wait()锛氭潵鑷狾bject绫伙紝锛屼細璁╃▼搴忚繘鍏ョ瓑寰呯姸鎬侊紝鍙湁閫氳繃notiy()鎴杗otifAllj()鏂规硶鎵嶈兘灏嗗畠鍞ら啋锛屼細閲婃斁閿佷笖涓嶉渶瑕佹崟鑾峰紓甯 4 join():鍦ㄤ竴涓嚎...
  • java涓璽hread鐨start鍜run鐨勫尯鍒
    绛旓細1.start锛堬級鏂规硶鏉ュ惎鍔绾跨▼锛岀湡姝e疄鐜颁簡澶氱嚎绋嬭繍琛岋紝杩欐椂鏃犻渶绛夊緟run鏂规硶浣撲唬鐮佹墽琛屽畬姣曡岀洿鎺ョ户缁墽琛屼笅闈鐨浠g爜锛氶氳繃璋冪敤Thread绫荤殑start()鏂规硶鏉ュ惎鍔ㄤ竴涓嚎绋嬶紝杩欐椂姝ょ嚎绋嬫槸澶勪簬灏辩华鐘舵侊紝骞舵病鏈夎繍琛屻傜劧鍚庨氳繃姝hread绫昏皟鐢鏂规硶run()鏉ュ畬鎴愬叾杩愯鎿嶄綔鐨勶紝杩欓噷鏂规硶run()绉颁负绾跨▼浣擄紝瀹冨寘鍚簡瑕佹墽琛岀殑...
  • Java绾跨▼涓璻un鍜宻tart鏂规硶鐨勫尯鍒?
    绛旓細骞朵笖run()鏂规硶蹇呴』鏄痯ublic璁块棶鏉冮檺锛岃繑鍥炲肩被鍨嬩负void.銆俓x0d\x0a\x0d\x0a涓ょ鏂瑰紡鐨勬瘮杈 锛歕x0d\x0a\x0d\x0a瀹為檯涓線寰閲囩敤瀹炵幇Runable鎺ュ彛锛屼竴鏂归潰鍥犱负java鍙敮鎸佸崟缁ф壙锛岀户鎵夸簡Thread绫诲氨鏃犳硶鍐嶇户缁户鎵垮叾瀹冪被锛岃屼笖Runable鎺ュ彛鍙湁涓涓猺un鏂规硶锛涘彟涓鏂归潰閫氳繃缁撴灉鍙互鐪嬪嚭瀹炵幇Runable鎺ュ彛鎵嶆槸...
  • 绾跨▼鐨start()鍜run()鍖哄埆?
    绛旓細1銆佸垱寤轰竴涓JAVA宸ョ▼銆2銆佹柊寤轰竴涓猅hreadTest绫诲苟鍒涘缓涓涓猘ttack鏂规硶銆3銆佸湪main鏂规硶涓璶ew涓涓嚎绋嬪苟鍦run鏂规硶涓墽琛宎ttack()鏂规硶銆4銆佽繍琛宮ain鏂规硶锛屾帶鍒跺彴鍙湁涓涓嚎绋嬭鏄run()鏂规硶鍙槸Thread鐨涓涓櫘閫氭柟娉曡皟鐢ㄣ5銆佷娇鐢╯tart()銆6銆佹帶鍒跺彴鎵撳嵃涓や釜绾跨▼锛岃鏄庤皟鐢╯tart()鏂规硶浼氬垱寤轰竴涓柊鐨勫瓙绾跨▼...
  • 鍒涘缓涓涓柊绾跨▼鍙互閫氳繃璋冪敤绾跨▼瀵硅薄鐨剅un鏂规硶
    绛旓細} } 鎴戜滑鍙互鍒涘缓涓涓绾跨▼瀵硅薄锛屽苟璋冪敤鍏秙tart鏂规硶鏉ュ惎鍔ㄤ竴涓柊绾跨▼锛java MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start(); // 鍚姩鏂扮嚎绋 鍦ㄤ笂闈㈢殑浠g爜涓紝鎴戜滑閫氳繃璋冪敤thread.start()鏉ュ惎鍔ㄤ竴涓柊绾跨▼锛岃屼笉鏄洿鎺ヨ皟鐢╩yRunnable.run()銆傚鏋...
  • Java涓嚎绋Thread鏈夋病鏈夊甫鍙傛暟鐨剅un鏂规硶鍛
    绛旓細娌℃湁锛岀嚎绋嬩腑娌℃湁甯﹀弬鏁鐨剅un鏂规硶銆傚鏋滄兂瑕佸疄鐜板甫鍙傛暟鐨剅un鏂规硶锛1銆佸畾涔夌嚎绋嬪唴鍙橀噺 2銆佸湪缁ф壙thread鐨鏃跺欙紝澧炲姞甯﹀弬鏁扮殑鏋勯犲嚱鏁帮紝鍒濆鍖栫嚎绋嬪唴鍙橀噺 3銆佸湪run鏂规硶鎿嶄綔绾跨▼鍐呭彉閲忥紝浠ヨ揪鍒扮被浼间紶鍙傜殑鏁堟灉銆傜ず渚嬶細class MyThread extends Thread{ int a = 0;//瀹氫箟绾跨▼鍐呭彉閲 public MyThread...
  • java鍒涘缓绾跨▼鐨勬柟娉
    绛旓細鏂瑰紡1锛氱户鎵Java.lang.Thread绫伙紝骞惰鐩run()鏂规硶銆備紭鍔匡細缂栧啓绠鍗曪紱鍔e娍锛氬崟缁ф壙鐨勯檺鍒---鏃犳硶缁ф壙鍏跺畠鐖剁被锛屽悓鏃朵笉鑳藉疄鐜拌祫婧愬叡浜傛柟寮2锛氬疄鐜癑ava.lang.Runnable鎺ュ彛锛屽苟瀹炵幇run()鏂规硶銆備紭鍔匡細鍙户鎵垮叾瀹冪被锛屽绾跨▼鍙叡浜悓涓涓猅hread瀵硅薄锛涘姡鍔匡細缂栫▼鏂瑰紡绋嶅井澶嶆潅锛屽闇璁块棶褰撳墠绾跨▼锛岄渶璋冪敤Thread.c...
  • java涓瀹炵幇绾跨▼鐨勬柟娉鏈夊摢浜
    绛旓細鈶燙allable瑙勫畾鐨鏂规硶鏄痗all()锛岃孯unnable瑙勫畾鐨勬柟娉曟槸run().鈶allable鐨勪换鍔℃墽琛屽悗鍙繑鍥炲硷紝鑰孯unnable鐨勪换鍔℃槸涓嶈兘杩斿洖鍊肩殑 鈶all()鏂规硶鍙姏鍑哄紓甯革紝鑰run()鏂规硶鏄笉鑳芥姏鍑哄紓甯哥殑銆傗懀杩愯Callable浠诲姟鍙嬁鍒颁竴涓狥uture瀵硅薄锛孎uture琛ㄧず寮傛璁$畻鐨勭粨鏋溿傚畠鎻愪緵浜嗘鏌ヨ绠楁槸鍚﹀畬鎴愮殑鏂规硶,浠ョ瓑 寰呰绠楃殑...
  • java涓缁堟绾跨▼鐨勬柟娉?
    绛旓細濡傛灉鐪熺殑闇瑕佺粓姝竴涓嚎绋嬶紝鍙互浣跨敤浠ヤ笅鍑犵鏂规硶锛1銆佽绾跨▼鐨剅un()鏂规硶鎵ц瀹岋紝绾跨▼鑷劧缁撴潫銆傦紙杩欑鏂规硶鏈濂斤級2銆侀氳繃杞鍜屽叡浜爣蹇椾綅鐨勬柟娉曟潵缁撴潫绾跨▼锛屼緥濡倃hile(flag){},flag鐨勫垵濮嬪艰涓虹湡锛屽綋闇瑕佺粨鏉熸椂锛java璇剧▼鍩硅鏈烘瀯寤鸿灏唂lag鐨勫艰涓篺alse銆傦紙杩欑鏂规硶涔熶笉寰堝ソ锛屽洜涓哄鏋渨hile(flag){...
  • 扩展阅读:java编程怎么发音 ... linux ... java ... java中start和run的区别 ... linux系统 ... java 线程池创建方式 ... java线程start和run的区别 ... java run方法 ... java创建线程的四种方式 ...

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