Java实现线程,一种是继承Thread类,一种是实现Runnable接口
一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务
而且Runnable接口可以避免单继承的局限,且更适合与资源共享
Thread t=new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
}
};
Thread t=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
下面以两种方法实现线程计数
package com.lmr.thread;
public class MyThread1 extends Thread{
private int count=10;
private String name;
public MyThread1(String name){
this.name=name;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(this.count>0){
System.out.println(name+" "+this.count--);
}
}
}
package com.lmr.thread;
public class MyRunnable1 implements Runnable{
private int count=10;
private String name;
@Override
public void run() {
// TODO Auto-generated method stub
while(this.count>0){
System.out.println(Thread.currentThread().getName()+" "+this.count--);
}
}
}
package com.lmr.thread;
public class TestThread1 {
public static void main(String[] args) {
MyThread1 mt1=new MyThread1("A");
MyThread1 mt2=new MyThread1("B");
MyThread1 mt3=new MyThread1("C");
mt1.start();
mt2.start();
mt3.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("-----------------------");
MyRunnable1 r1=new MyRunnable1();
Thread t1=new Thread(r1, "RA");
Thread t2=new Thread(r1, "RB");
Thread t3=new Thread(r1, "RC");
t1.start();
t2.start();
t3.start();
}
}
A 10
B 10
C 10
B 9
A 9
A 8
A 7
A 6
A 5
A 4
A 3
A 2
A 1
B 8
B 7
B 6
B 5
B 4
C 9
B 3
C 8
C 7
B 2
C 6
B 1
C 5
C 4
C 3
C 2
C 1
-----------------------
RA 10
RB 9
RB 8
RB 7
RB 6
RB 5
RB 3
RA 2
RC 4
RB 1
我们会发现结果中MyThread实例化的线程对象,是三个各不相干的线程
而实现Runnable的,则相当于实现三个线程去执行一个任务,所以其资源能够共享,但是由于系统对线程时间片的随机分配,导致有些线程执行的次数多,有些线程执行的次数少