java中thread的start和run的区别 JAVA 中thread的run和start方法有什么区别?

java\u4e2dthread\u7684start\u548crun\u7684\u533a\u522b

java\u4e2dthread\u7684start()\u65b9\u6cd5\u548crun()\u65b9\u6cd5\u7684\u533a\u522b:
t.start(); \u8be5\u884c\u4ee3\u7801\u76f8\u5f53\u4e8e\u662f\u542f\u52a8\u7ebf\u7a0b\uff0c
t.run(); \u8be5\u884c\u4ee3\u7801\u76f8\u5f53\u4e8e\u662f\u4f7f\u7528t\u8fd9\u4e2a\u7c7b\u4e2d\u7684run\u65b9\u6cd5\u800c\u5df2\u3002

1.start\uff08\uff09\u65b9\u6cd5\u6765\u542f\u52a8\u7ebf\u7a0b\uff0c\u771f\u6b63\u5b9e\u73b0\u4e86\u591a\u7ebf\u7a0b\u8fd0\u884c\uff0c\u8fd9\u65f6\u65e0\u9700\u7b49\u5f85run\u65b9\u6cd5\u4f53\u4ee3\u7801\u6267\u884c\u5b8c\u6bd5\u800c\u76f4\u63a5\u7ee7\u7eed\u6267\u884c\u4e0b\u9762\u7684\u4ee3\u7801\uff1a
\u901a\u8fc7\u8c03\u7528Thread\u7c7b\u7684start()\u65b9\u6cd5\u6765\u542f\u52a8\u4e00\u4e2a\u7ebf\u7a0b\uff0c
\u8fd9\u65f6\u6b64\u7ebf\u7a0b\u662f\u5904\u4e8e\u5c31\u7eea\u72b6\u6001\uff0c
\u5e76\u6ca1\u6709\u8fd0\u884c\u3002
\u7136\u540e\u901a\u8fc7\u6b64Thread\u7c7b\u8c03\u7528\u65b9\u6cd5run()\u6765\u5b8c\u6210\u5176\u8fd0\u884c\u64cd\u4f5c\u7684\uff0c
\u8fd9\u91cc\u65b9\u6cd5run()\u79f0\u4e3a\u7ebf\u7a0b\u4f53\uff0c
\u5b83\u5305\u542b\u4e86\u8981\u6267\u884c\u7684\u8fd9\u4e2a\u7ebf\u7a0b\u7684\u5185\u5bb9\uff0c
Run\u65b9\u6cd5\u8fd0\u884c\u7ed3\u675f\uff0c
\u6b64\u7ebf\u7a0b\u7ec8\u6b62\uff0c
\u800cCPU\u518d\u8fd0\u884c\u5176\u5b83\u7ebf\u7a0b\uff0c

2.run\uff08\uff09\u65b9\u6cd5\u5f53\u4f5c\u666e\u901a\u65b9\u6cd5\u7684\u65b9\u5f0f\u8c03\u7528\uff0c\u7a0b\u5e8f\u8fd8\u662f\u8981\u987a\u5e8f\u6267\u884c\uff0c\u8fd8\u662f\u8981\u7b49\u5f85run\u65b9\u6cd5\u4f53\u6267\u884c\u5b8c\u6bd5\u540e\u624d\u53ef\u7ee7\u7eed\u6267\u884c\u4e0b\u9762\u7684\u4ee3\u7801\uff1a

\u800c\u5982\u679c\u76f4\u63a5\u7528Run\u65b9\u6cd5\uff0c
\u8fd9\u53ea\u662f\u8c03\u7528\u4e00\u4e2a\u65b9\u6cd5\u800c\u5df2\uff0c
\u7a0b\u5e8f\u4e2d\u4f9d\u7136\u53ea\u6709\u4e3b\u7ebf\u7a0b--\u8fd9\u4e00\u4e2a\u7ebf\u7a0b\uff0c
\u5176\u7a0b\u5e8f\u6267\u884c\u8def\u5f84\u8fd8\u662f\u53ea\u6709\u4e00\u6761\uff0c
\u8fd9\u6837\u5c31\u6ca1\u6709\u8fbe\u5230\u5199\u7ebf\u7a0b\u7684\u76ee\u7684\u3002

\u4e3e\u4f8b\u8bf4\u660e\u4e00\u4e0b\uff1a
\u8bb0\u4f4f\uff1a\u7ebf\u7a0b\u5c31\u662f\u4e3a\u4e86\u66f4\u597d\u5730\u5229\u7528CPU\uff0c
\u63d0\u9ad8\u7a0b\u5e8f\u8fd0\u884c\u901f\u7387\u7684\uff01

public class TestThread1{
public static void main(String[] args){
Runner1 r=new Runner1();
//r.run();//\u8fd9\u662f\u65b9\u6cd5\u8c03\u7528\uff0c\u800c\u4e0d\u662f\u5f00\u542f\u4e00\u4e2a\u7ebf\u7a0b
Thread t=new Thread(r);//\u8c03\u7528\u4e86Thread(Runnable target)\u65b9\u6cd5\u3002\u4e14\u7236\u7c7b\u5bf9\u8c61\u53d8\u91cf\u6307\u5411\u5b50\u7c7b\u5bf9\u8c61\u3002
t.start();

for(int i=0;i<100;i++){
System.out.println("\u8fdb\u5165Main Thread\u8fd0\u884c\u72b6\u6001");
System.out.println(i);
}
}
}
class Runner1 implements Runnable{ //\u5b9e\u73b0\u4e86\u8fd9\u4e2a\u63a5\u53e3\uff0cjdk\u5c31\u77e5\u9053\u8fd9\u4e2a\u7c7b\u662f\u4e00\u4e2a\u7ebf\u7a0b
public void run(){

for(int i=0;i<100;i++){
System.out.println("\u8fdb\u5165Runner1\u8fd0\u884c\u72b6\u6001");
System.out.println(i);
}
}
}

java中thread的start()和run()的区别:
1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码:
通过调用Thread类的start()方法来启动一个线程,
这时此线程是处于就绪状态,
并没有运行。
然后通过此Thread类调用方法run()来完成其运行操作的,
这里方法run()称为线程体,
它包含了要执行的这个线程的内容,
Run方法运行结束,
此线程终止,
而CPU再运行其它线程,

2.run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码:
而如果直接用Run方法,
这只是调用一个方法而已,
程序中依然只有主线程--这一个线程,
其程序执行路径还是只有一条,
这样就没有达到写线程的目的。

举例说明一下:
记住:线程就是为了更好地利用CPU,
提高程序运行速率的!
public class TestThread1{
public static void main(String[] args){
Runner1 r=new Runner1();
//r.run();//这是方法调用,而不是开启一个线程
Thread t=new Thread(r);//调用了Thread(Runnable target)方法。且父类对象变量指向子类对象。
t.start();
for(int i=0;i<100;i++){
System.out.println("进入Main Thread运行状态");
System.out.println(i);
}
}
}
class Runner1 implements Runnable{ //实现了这个接口,jdk就知道这个类是一个线程
public void run(){
for(int i=0;i<100;i++){
System.out.println("进入Runner1运行状态");
System.out.println(i);
}
}
}
同时摘取一段外文网站论坛上的解释:
Why do we need start() method in Thread class? In Java API description for Thread class is written : "Java Virtual Machine calls the run method of this thread..".
Couldn't we call method run() ourselves, without doing double call: first we call start() method which calls run() method? What is a meaning to do things such complicate?

There is some very small but important difference between using start() and run() methods. Look at two examples below:
Example one:
Code:
Thread one = new Thread();
Thread two = new Thread();
one.run();
two.run();
Example two:
Code:
Thread one = new Thread();
Thread two = new Thread();
one.start();
two.start();
The result of running examples will be different.
In Example one the threads will run sequentially: first, thread number one runs, when it exits the thread number two starts.
In Example two both threads start and run simultaneously.
Conclusion: the start() method call run() method asynchronously (does not wait for any result, just fire up an action), while we run run() method synchronously - we wait when it quits and only then we can run the next line of our code.

Thread对象的run()方法在一种循环下,使线程一直运行,直到不满足条件为止,在你的main()里创建并运行了一些线程,调用Thread类的start()方法将为线程执行特殊的初始化的过程,来配置线程,然后由线程执行机制调用run()。如果你不调用start()线程就不会启动。

因为线程调度机制的行为是不确定的,所以每次运行该程序都会有不同的结果,你可以把你的循环次数增多些,然后看看执行的结果,你会发现main()的线程和Thread1是交替运行的。
4.还有就是尽管线程的调度顺序是不固定的,但是如果有很多线程被阻塞等待运行,调度程序将会让优先级高的线程先执行,而优先级低的线程执行的频率会低一些。

  1. start():启动线程

    run():执行方法,就是一个线程体,当run()方法执行结束意味着整个线程执结束。

  2. 下面举例说明:

    2.1 public static void main(String args[]) {
    Thread t = new Thread() {
    public void run() {
    pala();
    }
    };
    t.start();
    System.out.print("pili");
    }

    static void pala() {
    System.out.print("pala");
    }

    输出结果:pilipala

    2.2 public static void main(String args[]) {
    Thread t = new Thread() {
    public void run() {
    pala();
    }
    };
    t.run();
    System.out.print("pili");
    }

    static void pala() {
    System.out.print("pala");
    }
    输出结果: palapili




1) start:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2) run:
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。

  • 姹傛暀Java鑿滈笩闂
    绛旓細浣犱細浣跨敤绾跨▼鍚楋紵涓鑸湪UI浜や簰鐨勬椂鍊欙紝鐐瑰嚮鎸夐挳锛岃Е鍙戠殑澶勭悊浜嬪姟瑕佺敤涓涓嚎绋嬫潵澶勭悊銆備緥濡傦紝鍦ˋctionListener閲岄潰鐨actionPerformed閲岋紝涓 new Thread(new MyHandle(this)).start;涔嬪悗鍐欎竴涓狹yHandle鐨勭被 class MyHandle implements Runnable{ private SPi spi;public MyHandle(SPi spi){ this.spi=spi;}...
  • 鍦Java涓 Connection銆丼tatement銆丷esultSet 銆丳reparedSta_鐧惧害鐭 ...
    绛旓細Connection鏄缓绔嬩笌鏁版嵁搴撶殑閾炬帴锛孲tatement绠楁槸涓涓繛鎺ョ殑瀹炰緥锛岀敤鏉ユ墽琛孲QL璇彞锛孯esultSet鏄煡璇㈠悗寰楀埌鐨勭粨鏋滈泦锛屽緱鍒扮粨鏋滃悗蹇呴』鎵ц.next锛堬級鏂规硶 缁欎綘涓垜鍒氬啓鐨勪緥瀛愶紝鍖哄埆寰堝ソ鐞嗚В鐨勶紝鎴戜竴鑸兘鐢⊿tatement锛岃繖鏄涓娆$敤PreraredStatement 鍙笉杩囨槸鍦ㄥ悗闈㈣祴鍊艰屽凡 public class Test { public static...
  • java涓for璇彞鐨勬墽琛岄『搴
    绛旓細鍏堟妸for鍐欐垚濡備笅褰㈠紡 for(sta1;sta2;sta3){ sta4;} 1.杩涘叆寰幆鎵цsta1;//鍙槸杩涘叆鐨勬椂鍊欐墽琛.2.鎵цsta2;//鏉′欢涓虹湡鎵嶆墽琛宻ta4,涓嶇劧灏辫烦鍑篺or浜.3,鎵цsta4;4,鎵цsta3;5,鍐嶅洖鍒扮2姝ュ紑濮嬫墽琛
  • 鍏充簬JAVA鍐呭簱鐨勫熀纭鐭ヨ瘑
    绛旓細鎴戞彁渚涗竴涓java.util绫诲簱锛屽叾浠栫殑鑷繁鍘绘壘鎵惧惂 java.util鍖 鏈珷浠嬬粛Java鐨瀹炵敤宸ュ叿绫诲簱java.util鍖呫傚湪杩欎釜鍖呬腑锛孞ava鎻愪緵浜嗕竴浜涘疄鐢ㄧ殑鏂规硶鍜屾暟鎹粨鏋勩備緥濡傦紝Java鎻愪緵鏃ユ湡(Data)绫汇佹棩鍘(Calendar)绫绘潵浜х敓鍜岃幏鍙栨棩鏈熷強鏃堕棿锛屾彁渚涢殢鏈烘暟(Random)绫讳骇鐢熷悇绉嶇被鍨嬬殑闅忔満鏁帮紝杩樻彁渚涗簡鍫嗘爤(Stack)銆佸悜閲(...
  • Java涓璼talic void changename(studentstu){stu.setName"hong"}鏂规硶鍚...
    绛旓細涓嶅お鐞嗚В鍦ㄩ棶浠涔 鍏堣В閲婁笅鍙傛暟鍚 棣栧厛锛屼綘鍙戠殑璇彞鏈夐棶棰橈紝搴旇鏄痵tatic void changename(student stu){stu.setName("hong");} stalic锛熷簲璇ユ槸static 闈欐佹柟娉 void 琛ㄧず璇ユ柟娉曟病鏈夎繑鍥炲硷紝濡傛灉闇瑕佽繑鍥炲煎垯鏀逛负闇瑕佽繑鍥炵殑鏁版嵁绫诲瀷锛屽苟鍦ㄦ柟娉曚綋涓姞鍏eturn璇彞 student stu:student琛ㄧず绫伙紝杩欓噷涔熷彲浠...
  • java:rs=sta.executeQuery("select * from student");System.out.printl...
    绛旓細涓嶈兘杩欐牱鍚 rs.next 杩涜 璇诲彇缁撴灉闆 鐨勪笅涓鏉℃暟鎹 鎴愬姛涓簍rue 涓嶆垚鍔熶负false while(rs.next) //灏辨槸 灏唕s鍏ㄩ儴杩涜璇诲彇 if(rs.next) //rs杩涜璇诲彇涓娆 鍒ゆ柇鏄惁鏈夋暟鎹 System.out.println(rs.getString(1));..
  • 鐢Java璇█鐢ㄦ枃鏈ā鎷熸暟鎹簱
    绛旓細import java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.awt.Font.*;import javax.swing.event.*;import javax...c.add(sta,BorderLayout.CENTER);//鍦˙orderLayout.CENTER涓坊鍔犳枃鏈尯鍩熶綔涓轰富缂栬緫鍖 c.add(jl2,BorderLayout.SOUTH);//鍦˙orderLayout.SOUTH涓坊鍔犳爣...
  • 濡備綍閫氳繃JAVA鎿嶄綔SQLserver鏁版嵁搴
    绛旓細涔嬪墠杩滄爣鏁欒偛鑰佸笀鏁欐垜浠繖鏍锋妸sqlserver jdbc椹卞姩鍔犲埌classpath涓紝涓変釜jar鍖呫俰mport java.sql.*;public class DbTest { Connection con;Statement sta;ResultSet rs;String driver;String url;String user;String pwd;public DbTest(){ driver = "sun.jdbc.odbc.JdbcOdbcDriver";url = "jdbc:odbc...
  • java涓濡備綍灏嗏2014-07-07鈥濅繚瀛樺埌鏁版嵁绫诲瀷涓篢imestamp绫诲瀷鐨勬暟鎹簱...
    绛旓細鎮ㄥソ锛屾彁闂咃細 1銆侀鍏堝皢瀛楃涓茶浆鎹负Date绫诲瀷銆係tring ss = "2014-07-07"; long date = new SimpleDateFormat("yyyy-MM-dd").parse(ss).getTime(); 2銆佸洜涓篢imestamp鐨.setTime(long time)鎺ュ彈鐨勬槸long鍨嬶紝鎵浠ate.getTime()杞负姣銆3銆佷箣鍚sta.setTime(date);//浣犳噦鐨勩
  • java杩炴帴access鏁版嵁搴撶殑涓夌鏂瑰紡浠ュ強杩滅▼杩炴帴瀹炵幇浠g爜鍙婃暀绋媉鐧惧害鐭 ...
    绛旓細Statement sta = con.createStatement();ResultSet rst = sta.executeQuery("select * from demoTable");//demoTable涓篴ccess鏁版嵁搴涓殑涓涓〃鍚 if(rst.next()){ System.out.println("绾java浠g爜瀹炵幇:" + rst.getString("name"));} } catch (ClassNotFoundException e) { e.printStackTrace(...
  • 扩展阅读:java.52emu.cn ... bat365亚洲版 ... java runnable ... www.oneplus.com ... javascript 在线 ... seo短视频网页入口营销 ... 任天堂网站入口 ... java servlet ... public static void main ...

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