首页 > 代码库 > java实现多线程的方法
java实现多线程的方法
一、实现方法
1、继承Thread类
2、实现Runnable接口
(一)继承Thread类
对于直接继承Thread的类来说,代码大致框架是:
class 类名 extends Thread{方法1;方法2;…public void run(){// other code…}属性1;属性2;… }
先看一个错误的例子:
1 /** 2 * 继承Thread类,直接调用run方法 3 */ 4 class hello extends Thread { 5 private String name; 6 7 public hello() { 8 } 9 10 public hello(String name) {11 this.name = name;12 }13 14 public void run() {15 for (int i = 0; i < 5; i++) {16 System.out.println(name + "运行 " + i);17 }18 }19 20 public static void main(String[] args) {21 hello h1 = new hello("A");22 hello h2 = new hello("B");23 h1.run();24 h2.run();25 }26 }
我们会发现这些都是顺序执行的,说明我们的调用方法不对,应该调用的是start()方法。
将main函数改为以下代码
public static void main(String[] args) { hello h1 = new hello("A"); hello h2 = new hello("B"); h1.start(); h2.start(); }
运行的结果可能为:
A运行 0
B运行 0
A运行 1
B运行 1
A运行 2
B运行 2
A运行 3
A运行 4
B运行 3
B运行 4
因为需要用到CPU的资源,所以每次的运行结果基本是都不一样的。
注意:虽然我们在这里调用的是start()方法,但是实际上调用的还是run()方法的主体。
那么:为什么我们不能直接调用run()方法呢?
我的理解是:线程的运行需要本地操作系统的支持。
(二)实现Runnable接口
代码大致框架如下:
class 类名 implements Runnable{方法1;方法2;…public void run(){// other code…}属性1;属性2;… }
先看个例子(注意和继承Thread ,main函数的不同):
1 /** 2 * 调用Runnable方法 3 */ 4 class hello implements Runnable { 5 private String name; 6 7 public hello() { 8 } 9 10 public hello(String name) {11 this.name = name;12 }13 14 public void run() {15 for (int i = 0; i < 5; i++) {16 System.out.println(name + "运行 " + i);17 }18 }19 20 public static void main(String[] args) {21 hello h1 = new hello("A");22 Thread t1 = new Thread(h1);23 hello h2 = new hello("B");24 Thread t2 = new Thread(h2);25 t1.start();26 t2.start();27 }28 }
可能的运行结果为:
A运行 0
B运行 0
B运行 1
B运行 2
B运行 3
B运行 4
A运行 1
A运行 2
A运行 3
A运行 4
Thread和Runnable的区别:
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
总结一下:
实现Runnable接口比继承Thread类所具有的优势:
1)适合多个相同的程序代码的线程去处理同一个资源
2)可以避免java中的单继承的限制
3)增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
所以,本人建议大家尽量实现接口。
java实现多线程的方法