首先,定义线程。
1)扩展java.lang.Thread类。
此类中有个run()方法,应该注意其用法:
public void run()
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
Thread 的子类应该重写该方法。
2)实现java.lang.Runnable接口。
void run()
使用实现接口 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, long stackSize)
启动线程
在线程的Thread对象上调用start()方法,而不是run()或者别的方法。
在调用start()方法之前:线程处于新状态中,新状态指有一个Thread对象,但还没有一个真正的线程。
在调用start()方法之后:发生了一系列复杂的事情
启动新的执行线程(具有新的调用栈);
该线程从新状态转移到可运行状态;
当该线程获得机会执行时,其目标run()方法将运行。
注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。
例子 运行结果:
1.package thread_test;
2.
3./**
4. * 测试Runnable类实现的多线程程序
5. *
6. * @author ciding
7. * @createTime Dec 7, 2011 9:38:52 AM
8. *
9. */
10.public class TestRunnable {
11. public static void main(String[] args) {
12. StrRunnable sr1 = new StrRunnable("chenfengbin");
13. StrRunnable sr2 = new StrRunnable("cidng");
14.
15. Thread t1 = new Thread(sr1);
16. Thread t2 = new Thread(sr2);
17.
18. t1.start();
19. t2.start();
20.
21. StrThread st1 = new StrThread("chenfengbin");
22. StrThread st2 = new StrThread("cidng");
23.
24. Thread t3 = new Thread(st1);
25. Thread t4 = new Thread(st2);
26.
27. t3.start();
28. t4.start();
29. }
30.}
31.
32./**
33. * 通过实现接口的多线程
34. *
35. * @author ciding
36. * @createTime Dec 8, 2011 10:20:28 PM
37. *
38. */
39.class StrRunnable implements Runnable {
40. private String name;
41.
42. public StrRunnable(String name) {
43. this.name = name;
44. }
45.
46. public void run() {
47. for (int i = 0; i < 3; i++) {
48. for(long j=0;j<100000000;j++); //用来模拟一个非常耗时的操作,方便显示多线程效果。
49. System.out.println("Runnable下的" + name + ": " + i);
50. }
51. }
52.}
53.
54./**
55. * 通过继承类的多线程
56. *
57. * @author ciding
58. * @createTime Dec 8, 2011 10:20:50 PM
59. *
60. */
61.class StrThread extends Thread{
62. private String name;
63.
64. public StrThread(String name){
65. this.name = name;
66. }
67.
68. public void run() {
69. for (int i = 0; i < 3; i++) {
70. for(long j=0;j<100000000;j++); //用来模拟一个非常耗时的操作,方便显示多线程效果。
71. System.out.println("Thread下的" + name + ": " + i);
72. }
73. }
74.}
1.Runnable下的chenfengbin: 0
2.Runnable下的cidng: 0
3.Thread下的chenfengbin: 0
4.Thread下的cidng: 0
5.Runnable下的chenfengbin: 1
6.Runnable下的cidng: 1
7.Thread下的chenfengbin: 1
8.Thread下的cidng: 1
9.Runnable下的chenfengbin: 2
10.Thread下的chenfengbin: 2
11.Runnable下的cidng: 2
12.Thread下的cidng: 2
¥399.00
¥498.00
¥299.00
¥29.00