【IT168技术】首先,定义线程。
1)扩展java.lang.Thread类。
此类中有个run()方法,应该注意其用法:
publicvoidrun()
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
Thread 的子类应该重写该方法。
2)实现java.lang.Runnable接口。
voidrun()
使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。
方法 run 的常规协定是,它可能执行任何所需的操作。
实例化线程
如果是扩展java.lang.Thread类的线程,则直接new即可。
如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法:
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name,longstackSize)
启动线程
在线程的Thread对象上调用start()方法,而不是run()或者别的方法。
在调用start()方法之前:线程处于新状态中,新状态指有一个Thread对象,但还没有一个真正的线程。
在调用start()方法之后:发生了一系列复杂的事情
启动新的执行线程(具有新的调用栈);
该线程从新状态转移到可运行状态;
当该线程获得机会执行时,其目标run()方法将运行。
注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。
例子 运行结果:
1.packagethread_test;2.3./**4. * 测试Runnable类实现的多线程程序
5. *
6. *@authorciding
7. * @createTime Dec 7, 2011 9:38:52 AM
8. *
9.*/10.publicclassTestRunnable {11.publicstaticvoidmain(String[] args) {12. StrRunnable sr1=newStrRunnable("chenfengbin");13. StrRunnable sr2=newStrRunnable("cidng");14.15. Thread t1=newThread(sr1);16. Thread t2=newThread(sr2);17.18. t1.start();19. t2.start();20.21. StrThread st1=newStrThread("chenfengbin");22. StrThread st2=newStrThread("cidng");23.24. Thread t3=newThread(st1);25. Thread t4=newThread(st2);26.27. t3.start();28. t4.start();29. }30.}31.32./**33. * 通过实现接口的多线程
34. *
35. *@authorciding
36. * @createTime Dec 8, 2011 10:20:28 PM
37. *
38.*/39.classStrRunnableimplementsRunnable {40.privateString name;41.42.publicStrRunnable(String name) {43.this.name=name;44. }45.46.publicvoidrun() {47.for(inti=0; i<3; i++) {48.for(longj=0;j<100000000;j++);//用来模拟一个非常耗时的操作,方便显示多线程效果。49. System.out.println("Runnable下的"+name+":"+i);50. }51. }52.}53.54./**55. * 通过继承类的多线程
56. *
57. *@authorciding
58. * @createTime Dec 8, 2011 10:20:50 PM
59. *
60.*/61.classStrThreadextendsThread{62.privateString name;63.64.publicStrThread(String name){65.this.name=name;66. }67.68.publicvoidrun() {69.for(inti=0; i<3; i++) {70.for(longj=0;j<100000000;j++);//用来模拟一个非常耗时的操作,方便显示多线程效果。71. System.out.println("Thread下的"+name+":"+i);72. }73. }74.}
1.Runnable下的chenfengbin:02.Runnable下的cidng:03.Thread下的chenfengbin:04.Thread下的cidng:05.Runnable下的chenfengbin:16.Runnable下的cidng:17.Thread下的chenfengbin:18.Thread下的cidng:19.Runnable下的chenfengbin:210.Thread下的chenfengbin:211.Runnable下的cidng:212.Thread下的cidng:2