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