java启动线程时 extends与implements的一个差异

java extends与implements在使用时的一个差异:

Implements:

public class ThreadImplementsTest  implements Runnable{
    
    public void loop(){
        String name=Thread.currentThread().getName();
        System.out.println(name+"====>进入loop()");
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                System.out.println(e);
            }
        }
        System.out.println(name+"=============>离开Loop");
    }
    

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ThreadSleepTest tst=new ThreadSleepTest();
        tst.run();
        
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        tst.loop();
    }

    public void run() {
        // TODO Auto-generated method stub
        loop();
    }
}
Output:

main====>进入loop()
main=============>离开Loop
main====>进入loop()
main=============>离开Loop

可以看出直接在ThreadImplementsTest 中调用run方法是没有多线程的,原因是实现Runnable接口的类,只是说明具备了多线程的能力,要在多线程下运行,需要给一个环境(机会):

可使用以下两种方法来调用:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadImplTest {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ThreadImplementsTest tit=new ThreadImplementsTest();
//        new Thread(tit).start();
//        tit.loop();
    //或
        //推荐使用此方式调用
        ExecutorService es=Executors.newCachedThreadPool(); 
        es.execute(tit);
        tit.loop();
    }
}
Output:
//new Thread(tit).start();

main====>进入loop()
Thread-0====>进入loop()
0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
Thread-0=============>离开Loop
main=============>离开Loop

//        ExecutorService es=Executors.newCachedThreadPool(); 
//        es.execute(tit);

pool-1-thread-1====>进入loop()
main====>进入loop()
0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
pool-1-thread-1=============>离开Loop
main=============>离开Loop

Extends:
public class ThreadExtendsTest extends Thread {
    public void loop(){
        String name=Thread.currentThread().getName();
        System.out.println(name+"====>进入loop()");
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                System.out.println(e);
            }
        }
        System.out.println(name+"=============>离开Loop");
    }
    
    public void run() {
        // TODO Auto-generated method stub
        loop();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ThreadExtendsTest tet=new ThreadExtendsTest();
        tet.setName("Test Thread");
        tet.start();
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        tet.loop();
        
    }

}
Output:

Test Thread====>进入loop()
main====>进入loop()
Test Thread=============>离开Loop
main=============>离开Loop

 
 
 





 
 
 
 
原文地址:https://www.cnblogs.com/softidea/p/3402210.html