在java中我们使用多线程的情况 一般就两种情况.第一种:继承thread.第二种:实现runnable.
那么我们先来看看第一种继承thread的情况:
对于直接继承Thread的类来说,代码大致框架如下:
class 类名 extends Thread{
方法1;
方法2;
.........
public void run(){
}
属性1;
属性2;
..........
}
那么我们先来看一个简单的例子.代码如下:
public class DoubleDemo extends Thread{
private String name;
public DoubleDemo(String name){
this.name=name;
}
//主方法
public void run(){
for(int i=0;i<5;i++){
System.out.println(name+"运行===>"+i);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DoubleDemo d1=new DoubleDemo("A");
DoubleDemo d2=new DoubleDemo("B");
d1.start();
d2.start();
}
}
[输出结果:]
A运行===>0
B运行===>0
A运行===>1
A运行===>2
B运行===>1
A运行===>3
B运行===>2
B运行===>3
B运行===>4
A运行===>4
因为需要用到CPU的资源,所以每次的运行结果基本上都不是一样的.注意:虽然我们在这里调用的是start()方法,
但是实际上主体作用还是run()方法.
那么:为什么我们不能直接调用run()方法呢?
我的理解是:线程的运行需要本地操作系统的支持.
如果你查看start源代码的时候你会发现: 有一句调用的是start0().并且这个方法用了native关键字.次关键字标示调用本地操作系统的函数.因为多线程的实现
需要本地操作系统的支持.但是start方法重复调用的话,会出现 java.lang.illegalthreadstateException异常
第二种情况 通过实现runnable接口:
大致框架是:
class 类名 implement Runnable{
方法1;
方法2;
.........
public void run(){
}
属性1;
属性2;
..........
}
我们将上面的例子稍微修改一下 如下:
public class MyRunnable implements Runnable{
private String name;
public MyRunnable(String name){
this.name=name;
}
public void run(){
for(int i=0;i<5;i++){
System.out.println(name+"运行======>"+i);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyRunnable m1=new MyRunnable("线程A");
Thread t1=new Thread(m1);
MyRunnable m2=new MyRunnable("线程B");
Thread t2=new Thread(m2);
t1.start();
t2.start();
}
}
[运行结果]
线程A运行======>0
线程B运行======>0
线程A运行======>1
线程A运行======>2
线程A运行======>3
线程A运行======>4
线程B运行======>1
线程B运行======>2
线程B运行======>3
线程B运行======>4
关于我们到底选择哪一个,就要看你的程序设计了.如果一个类继承Thread 则不适合资源共享.但是如果实现runnable,则很容易实现资源共享. 下一篇我们将深入了解.