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

 
 
 

 
 
 
 
时间: 2024-09-30 06:57:20

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

关于解决Java编程语言线程问题的建议

Allen Holub 指出,Java 编程语言的线程模型可能是此语言中最薄弱的部分.它完全不适合实际复杂程序的要求,而且也完全不是面向对象的.本文建议对 Java 语言进行重大修改和补充,以解决这些问题. Java 语言的线程模型是此语言的一个最难另人满意的部分.尽管 Java 语言本身就支持线程编程是件好事,但是它对线程的语法和类包的支持太少,只能适用于极小型的应用环境. 关于 Java 线程编程的大多数书籍都长篇累牍地指出了 Java 线程模型的缺陷,并提供了解决这些问题的急救包(Band

java-JAVA启动线程的问题不清楚

问题描述 JAVA启动线程的问题不清楚 启动线程: new Thread(x).start()和x.start()有什么区别,什么时候该用那个? 解决方案 前者定义了一个无名线程直接启动了,而后者定义了一个线程变量名为t,二者功效一样,但是后者可以对这个线程对象进行其他操作,例如中断x. interrupt();区别就是是否需要对线程对象进行其他操作,如果需要的话就要用变量接收. 解决方案二: 对于线程的启动来说,是一样的. 但后继是否还有操作线程,两者是不一样的:前者无法再操作此线程,而后者可

Java中定时启动线程

这里提供两种在指定时间后启动线程的方法.一是通过java.util.concurrent.DelayQueue实现:二是通过java.util.concurrent.ScheduledThreadPoolExecutor实现. 1. java.util.concurrent.DelayQueue 类DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素.它接受实现Delayed接口的实例作为元素. <<interface>>Delayed.java package

详解Java编程中线程同步以及定时启动线程的方法_java

使用wait()与notify()实现线程间协作 1. wait()与notify()/notifyAll()调用sleep()和yield()的时候锁并没有被释放,而调用wait()将释放锁.这样另一个任务(线程)可以获得当前对象的锁,从而进入它的synchronized方法中.可以通过notify()/notifyAll(),或者时间到期,从wait()中恢复执行. 只能在同步控制方法或同步块中调用wait().notify()和notifyAll().如果在非同步的方法里调用这些方法,在运

多线程问题-新手求助关于Java多线程中启动线程问题

问题描述 新手求助关于Java多线程中启动线程问题 public class Example15_1 { /** * @param args */public static void main(String[] args) { // TODO Auto-generated method stub SpeakHello speakHello; SpeakNinhao speakNinhao; speakHello = new SpeakHello(); speakNinhao= new Speak

浅析Java中线程的创建和启动_java

前言 线程是一个程序内部的顺序控制流.cpu实际上在一个时间点上,只执行一个.只不过我们把cup分成了多个时间片,由于速度很快,我们看起来像是多个线程.就像你的时间分成几片,这样整体看来做事情有规律,效率就会高,何况是cup呢. 线程的创建和启动:      (1)定义Thread类的子类,并重写了该类的run()方法,该run()方法的方法就代表了线程需要完成的任务.因此把run()方法称为线程执行体      (2)创建Thread子类的实例,即创建了线程对象      (3)调用线程对象的

使用osgi api启动osgi时,用java -jar命令运行报异常,用eclipse运行正常

问题描述 使用osgi api启动osgi时,用java -jar命令运行报异常,用eclipse运行正常 我使用osgi的api写了osgi框架的启动程序,然后使用java -jar 命令运行这个jar包报空指针异常,我在eclipse中运行一切正常,请问这是为什么呀

java中extends与implements的区别浅谈_java

1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用2.extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口 来实现,这样就要用到implements,继承只能继承一个

启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

原文:启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法 一.问题描述 今天一来公司,在IntelliJ IDEA 中启动Tomcat服务器时就出现了如下图所示的错误: 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java.net.