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

 

 
 

 
 
 
 

最新文章

  1. 关于Raid0,Raid1,Raid5,Raid10的总结
  2. html中frameset简介
  3. Force.com微信开发系列(七)OAuth2.0网页授权
  4. WPF-21:WPF实现仿安卓的图案密码键盘(初级)
  5. #DP# ----- OpenJudge山区建小学
  6. [ SharePoint ADFS 开发部署系列 (一)]
  7. 【JAVAWEB学习笔记】19_事务
  8. (办公)MojoExecutionException
  9. 记一次easywechat企业付款问题
  10. linux时间戳和时间格式的转化
  11. Android 解决在初次打开Activity加载布局文件时,ScrollView滚动条不在顶部的问题
  12. linux-centos6-rabbitmq安装及配置
  13. Beta发布——美工+文案
  14. P1407 [国家集训队]稳定婚姻
  15. Java (Socket,ServerSocket)与(SocketChannel,ServerSocketChannel)区别和联系
  16. SpringBoot学习:获取yml和properties配置文件的内容
  17. AF 与 PF区别
  18. Idea_学习_03_IDEA中使自定义类型的文件进行代码高亮识别
  19. 类方法,实例方法,静态方法,@property的应用
  20. android 开发AlertDialog.builder对话框的实现

热门文章

  1. js常用的校验代码 (整理)
  2. IdentityServer4与ocelot实现认证与客户端统一入口
  3. 基于GOJS绘制流程图
  4. day03.1-函数编程
  5. 【English】20190430
  6. 【转】WinForm多线程学习文档
  7. php面向对象编程_1
  8. 6,synchronized, lock 区别
  9. Mockplus原型设计工具介绍
  10. 适配器模式-如何把usb插到插座上