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

 

 
 

 
 
 
 

java启动线程时 extends与implements的一个差异的更多相关文章

  1. Java 启动线程的方式

    面试题:JAVA启动线程的方式有哪些? 1.继承Thread [java] view plaincopy public class java_thread extends Thread{ public ...

  2. JAVA - 启动线程有哪几种方式

    JAVA - 启动线程有哪几种方式 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行 ...

  3. Java启动工程时,加载固定数据到Map中(不用每次访问数据库)

    如下:启动工程时,加载配置文件的用户名和密码到map中, 通过getKeyByValue()获取即可 import java.util.HashMap; import java.util.Map; i ...

  4. Java:extends和implements的区别+用法

    Java代码中的extends和implements让我感到很迷惑,现在终于弄明白它们之间的区别和用法了. [c-sharp] view plain copy //定义一个Runner接口 publi ...

  5. Java调度线程池ScheduleExecutorService(续)

    链接 Java线程池详解(一) Java线程池详解(二) Java调度线程池ScheduleExecutorService 上面列出了最近写的关于java线程池ScheduleExecutorServ ...

  6. Java多线程-线程的生命周期

    线程可以分为4个状态:New(新生),Runnable(可运行):为了方便分析,还可将其分为:Runnable与Running.blocked(被阻塞),Dead(死亡). 与人有生老病死一样,线程也 ...

  7. 面试官:Java中线程是按什么顺序执行的?

    摘要:Java中多线程并发的执行顺序历来是面试中的重点,掌握Java中线程的执行顺序不仅能够在面试中让你脱颖而出,更能够让你在平时的工作中,迅速定位由于多线程并发问题导致的"诡异" ...

  8. Qt 进程和线程之二:启动线程

    Qt提供了对线程的支持,这包括一组与平台无关的线程类.一个线程安全的发送事件的方式,以及跨线程的信号槽的关联.这些使得可以很容易地开发可移植的多线程Qt应用程序,可以充分利用多处理器的机器.多线程编程 ...

  9. java——多线程—启动线程

    继承Thread启动线程 package com.mycom.继承Thread启动线程; /** * * 继承Thread类启动线程的步骤 * 1.定义自定义线程类并继承Thread * 2.重写ru ...

随机推荐

  1. Autofac的简单使用

    今天记录一下学习Autofac的过程. 之前对IoC与DI一直很迷糊,今天研究了前辈们的文章后,才对IoC和DI有了一个初步的了解.感谢前辈们的无私奉献! 文章地址: 依赖注入和控制反转的理解,写的太 ...

  2. NuGet文件下载与应用

    nuget是一款.net下强大的包管理开发工具,Visual Studio 2013和Visual Studio 2015都缺省支持Nuget.在线开发能享受到Nuget的便利,但是如果是离线开发,还 ...

  3. 比较旧的写法:验证车牌、手机号、电话、qq等

    1.验证车牌代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  4. window.onload与$(document).ready()的对比

    一.window.onload:(1)必须等待网页中所有的内容加载完毕后(包括图片)才能执行:(2)不能同时编写多个,如: window.onload = function(){ alert(&quo ...

  5. “全栈2019”Java第九章:解释第一个程序

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. AutoCAD.Net圆弧半径标注延长线

    #region 注册RegApp public static void CheckRegApp(string regapptablename) { Database db = HostApplicat ...

  7. Intellij idea maven 引用无法搜索远程仓库的解决方案

    打开项目的POM文件,ALT+Insert键 出来添加引用的窗口 说明无法搜索到远程仓库,需要怎么设置呢? 在intellij idea 中配置好maven后 是这样的 如果加载失败,则需要自定义远程 ...

  8. java 使用idea将工程打成jar并创建成exe文件类型执行

    https://blog.csdn.net/weixin_38310965/article/details/80392767

  9. L1-1 天梯赛座位分配

    天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位 ...

  10. 2019 CCPC-Wannafly Winter Camp Day5(Div2, onsite)

    solve 5/11 补题:7/11 A Cactus Draw Code:zz Thinking :zz 题意:要在n*n的网格内画上一棵节点数为n树,使得没有边相交. 很好想的构造题,因为网格有n ...