扩展java.lang.Thread类
实现java.lang.Runnable接口
1、继承Thread类实现多线程
继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:
- /**
- * @Description: 继承Thread类, 实现多线程.
- */
- package com.lian.thread;
- import org.apache.log4j.Logger;
- public class MyThread extends Thread {
- private static Logger logger = Logger.getLogger(MyThread .class);
- private int num = 5;
- public static void main(String[] args) {
- MyThread t1 = new MyThread();
- MyThread t2 = new MyThread();
- MyThread t3 = new MyThread();
- t1.start();//start为线程入口,通过它启动线程;直接调用run就变成了普通方法,没有加入到线程中
- t2.start();
- t3.start();
- }
- public void run() {
-
for(int i=0;i<100;i++){
-
if(num>0){
-
// 获取当前线程的对象的方法是: Thread.currentThread()
-
System.out.println(Thread.currentThread().getName() + "买票" + (num --));
-
}
-
}
- }
- }
输出结果:
Thread-2卖票5
Thread-2卖票4
Thread-2卖票3
Thread-2卖票2
Thread-2卖票1
Thread-1卖票5
Thread-1卖票4
Thread-1卖票3
Thread-1卖票2
Thread-1卖票1
Thread-3卖票5
Thread-3卖票4
Thread-3卖票3
Thread-3卖票2
Thread-3卖票1
2、实现Runnable接口方式实现多线程
- /**
- * @Description: 测试Runnable类实现的多线程程序
- */
- package com.lian.thread;
- import org.apache.log4j.Logger;
- public class TestRunnable {
- private static Logger logger = Logger.getLogger(MyRunnable .class);
- public static void main(String[] args) {
- // 1. 将任务处理代码移到实现了Runnable接口的类的run方法中。
- // 2. 创建任务类的一个对象
- // 3. 由Runnable创建Thread对象
- // 4. 启动线程
- MyRunnable r = new MyRunnable();
- Thread r1 = new Thread(r, "A");
- Thread r2 = new Thread(r, "B");
- Thread r3 = new Thread(r, "C");
- r1.start();
- r2.start();
- r3.start();
- }
- }
- class MyRunnable implements Runnable {
- private int num = 5;
- // 当线程目标run()方法结束时该线程完成。
- public void run() {
- for (int i = 0; i < 100; i++) {
- if(num > 0){
- System.out.println(Thread.currentThread().getName() + "买票" + (num --));
- }
- }
- }
- }
A买票5
C买票3
B买票4
C买票1
A买票2
总结:
通过Rannable接口实现接口有如下的好处:
(1)适合于多个相同的程序代码的线程去处理同一资源。
(2)可以避免由于单继承带来的局限。
(3)增强了程序的健壮性,代码能够被多个线程共享,代码和数据独立。
共同点:
不论用哪种方法,都必须用Thread(如果是Thead子类就用它本身)产生线程,然后再调用start()方法。
不同点:
1、继承Thread类有一个缺点就是单继承,而实现Runnable接口则弥补了它的缺点,可以实现多继承
2、继承Thread类如果产生Thread实例对象,就必须产生多个Thread实例对象,然后再用Thread产生多个线程;而实现Runnable接口,只需要建立一个实现这个类的实例,然后用这一个实例对象产生多个线程。即实现了资源的共享性
基于以上两点所以建议用第二种方法