当前位置:编程学习 > JAVA >>

java 实现多线程的2种方法有什么区别?

去面试的面试官问我,我也说不清楚具体什么区别,大家怎么看待这个问题呢 --------------------编程问答-------------------- 没区别,本质上是一样的。

但是,java语言只支持单继承,但是可以实现多个接口,因此,实现接口相对来说比较灵活! --------------------编程问答-------------------- 实现多线程? 你确定没说错? --------------------编程问答-------------------- 我是来看LZ头像的! --------------------编程问答-------------------- 两种多态方式,一个是继承类。 一个是实现接口 --------------------编程问答-------------------- 这个恶心的问题,主要是性能的问题
MyThread myThread = new MyThread();
myThread.start();
而实现借口呢:
MyRunable myRunnable = new myRunnable();
MyRunable myRunnable1 = new myRunnable();
MyRunable myRunnable2 = new myRunnable();
Thread thread = new Thread();
thread(myRunnable).start();
thread(myRunnable1).start();
thread(myRunnable2).start();
对于继承的就必须new一个新的Thread实现类,而继承只需要一个就够了
另一种说法就是你既然继承了,但是你还要再继承其他的类的话就不可以了 --------------------编程问答-------------------- 我觉得还有一点就是:继承Thread类的线程实例只能启动一个线程;
实现Runnable接口的线程实例可以启动多个线程. --------------------编程问答-------------------- 一个是继承类。 一个是实现接口 --------------------编程问答-------------------- 其实主要问题是java 只支持单继承  所以你懂了么? --------------------编程问答-------------------- 实现接口比较好吧
因为继承的话如果别的东西还要继承就没办法了 --------------------编程问答-------------------- 其实是一种方法:即实现了Thread类的run()方法.只不过一个是通过继承中通过方法覆盖的方式实现,另外一个是Thread类的默认的run()方法实现:如果该线程对象是用实现Runable接口的对象创建的,那么就调用这个Runable接口对象的run()方法 --------------------编程问答-------------------- 就实质来说,Thread类也是通过实现runnable接口来实现功能的。
就应用来说,实现Runnable接口比继承Thread类更优质,很多高人如是说。
还有,#5楼的代码是错的,编译都不会通过……
#6楼说的有点意思,通过实现Runnable接口的run()方法可以用于多个由它构造的线程实例,而写在Thread子类中的run()方法只能被它自己用。 --------------------编程问答-------------------- 如果一个类通过继承Thread来实现多线程的话,则不适合多个线程共享资源,而通过实现Runnable就可以做到这一点,下面给lz举个例子:

class MyTheard extends Thread{
private int num = 5;//不能声明为静态的全局变量
public void run(){
for(int i=0;i<100;i++){
if(num>0){
System.out.println(Thread.currentThread().getName()+"卖票"+":"+(num--));
}
}
}
}

public class TheardDemo01 {
public static void main(String[] args) {
MyTheard th1 = new MyTheard();
MyTheard th2 = new MyTheard();
MyTheard th3 = new MyTheard();
th1.start();
th2.start();
th3.start();
}

}


输出结果:
Thread-0卖票:5
Thread-0卖票:4
Thread-0卖票:3
Thread-0卖票:2
Thread-0卖票:1
Thread-2卖票:5
Thread-2卖票:4
Thread-2卖票:3
Thread-2卖票:2
Thread-2卖票:1
Thread-1卖票:5
Thread-1卖票:4
Thread-1卖票:3
Thread-1卖票:2
Thread-1卖票:1

class MyThread implements Runnable
{
private int num = 5;
public void run(){
for(int i = 0;i<100;i++){
if(num>0){
System.out.println(Thread.currentThread().getName()+"卖票:"+" "+(num--));
}
}
}
};

public class ThreadDemo02 
{
public static void main(String[] args) 
{
MyThread mt = new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}


输出结果:
Thread-1卖票: 5
Thread-1卖票: 2
Thread-1卖票: 1
Thread-0卖票: 4
Thread-2卖票: 3
总结:
通过Rannable接口实现接口有如下的好处:
(1)适合于多个相同的程序代码的线程去处理同一资源。
(2)可以避免由于单继承带来的局限。
(3)增强了程序的健壮性,代码能够被多个线程共享,代码和数据独立。
--------------------编程问答--------------------
引用 2 楼 afer198215 的回复:
实现多线程? 你确定没说错?
没错的,相信你的眼睛 --------------------编程问答--------------------
引用 3 楼 gavin_ts 的回复:
我是来看LZ头像的!
想看你就看,just doit --------------------编程问答--------------------
引用 12 楼 chianfirstli 的回复:
如果一个类通过继承Thread来实现多线程的话,则不适合多个线程共享资源,而通过实现Runnable就可以做到这一点,下面给lz举个例子:
Java code

class MyTheard extends Thread{
    private int num = 5;//不能声明为静态的全局变量
    public void run(){
        for(int i=0;i<1……
小弟就是喜欢你这样用数据说话的大牛,顶 --------------------编程问答-------------------- 如果说的是Thread和Runnable的话,我更喜欢Runnable:

public class DownloadTask implements Runnable{
private ThreadPool threadPool;

public void start(){
if(null != threadPool){
threadPool.execute(this);
}else{
new Thread(this).start();
}
}

public void run(){
//....
}

public void setThreadPool(ThreadPool threadPool){
this.threadPool = threadPool;
}
}
--------------------编程问答-------------------- 继承没有接口实现的多 --------------------编程问答-------------------- 1. 继承Thread--- java只支持单继承,如果继承线程类的话就不能再继承了

2. 实现Runnable--- 实现接口可以带来更大的灵活性,改天如果觉得需要另一个类中的方法,那么再继承那个类就行,不影响原来的代码。方法1就不行。

2者在功能上是没有区别的 --------------------编程问答-------------------- java没有多继承,使用实现Runnable接口方式,可以达到Extends其他类的同时,implements Runnable接口的效果。
个人理解,呵呵,其实我也是来看头像的。。。 --------------------编程问答--------------------
引用 19 楼 monghuan 的回复:
java没有多继承,使用实现Runnable接口方式,可以达到Extends其他类的同时,implements Runnable接口的效果。
个人理解,呵呵,其实我也是来看头像的。。。
头像\(^o^)/~好看不? --------------------编程问答-------------------- 实现Runnable接口可以解决资源共享的问题。 --------------------编程问答-------------------- 顶下12楼的 ,12楼的已经把区别说清楚了! --------------------编程问答-------------------- 希望社区里全部都是像12的牛人, 拿代码解释。 还那么详细... --------------------编程问答-------------------- 如果一个类继承了Thread 那么这个类当然不能被多继承 但是Runnable就不一样了 可以实现过个接口,用Runnable解决了单继承的问题,然而Runnable 其实不是线程,只是这个接口中实现了run()方法,当你调用线程的时候 还是要声明Thread对象,启动线程,只是Runnable接口的好处就是不被单继承,资源共享的好处,可以代码重用。 --------------------编程问答-------------------- 实现多线程有两种方式,一个是继承类,一个是实现接口。可以从继承类和实现接口的区别回答~~ --------------------编程问答-------------------- 就我个人而言,我比较喜欢使用工作者模式的实现接口的方式,不过也不能一概而论哈。 --------------------编程问答-------------------- 都是通过Thread类的run()方法实现的,只不过一个是通过覆盖这个方法,一个是利用自身默认的调用Runable接口对象的run()方法 --------------------编程问答--------------------
引用 23 楼 jx1246080675 的回复:
希望社区里全部都是像12的牛人, 拿代码解释。 还那么详细...
是啊 --------------------编程问答-------------------- 效果一样,都能实现
但一般使用接口的那种方法 --------------------编程问答-------------------- 笑看楼主头像,不语 --------------------编程问答-------------------- 多继承单继承的区别嘛,虽说java没有多继承,但加上接口就相当于多继承了 --------------------编程问答-------------------- 通过实现Runnable接口之后,但是还是需要Thread包装才能启动线程。 --------------------编程问答--------------------
引用 32 楼 yanmushi 的回复:
通过实现Runnable接口之后,但是还是需要Thread包装才能启动线程。
是啊,感觉小麻烦呢 --------------------编程问答--------------------
引用 33 楼 makeppy 的回复:
引用 32 楼 yanmushi 的回复:

通过实现Runnable接口之后,但是还是需要Thread包装才能启动线程。
是啊,感觉小麻烦呢

一个命令模式的应用而已  你这么说 其实继承Thread  也是实现了 Runnable 接口 --------------------编程问答-------------------- 实现多线程的两种方法??????

为什么我看这个题目就没有看懂??? --------------------编程问答-------------------- 首先接口可以避免单继承带来的局限 还有重要的一点是实现Runnable接口可以达到资源共享的目的 比如说四个售票窗口同时卖1000张票 只能有Runnable接口来达到效果 即只有一个对象 --------------------编程问答--------------------
引用 35 楼 bao110908 的回复:
实现多线程的两种方法??????

为什么我看这个题目就没有看懂???
就是问继承Thread和实现Runnable接口的区别,可能是小弟我表达不是很到位,欢迎大牛指点一二,纯是请教,呵呵 --------------------编程问答-------------------- 没有区别,
写法不一样而已!
实质都是 
Thread.start();
--------------------编程问答-------------------- 看到一篇文章,也是讨论这个问题的

http://software.intel.com/zh-cn/blogs/2011/11/16/java-12/?cid=sw:prccsdn2063 --------------------编程问答-------------------- 每天回帖有十分。。。 --------------------编程问答--------------------
引用 12 楼 chianfirstli 的回复:
如果一个类通过继承Thread来实现多线程的话,则不适合多个线程共享资源,而通过实现Runnable就可以做到这一点,下面给lz举个例子:

Java code

class MyTheard extends Thread{
    private int num = 5;//不能声明为静态的全局变量
    public void run(){
        for(int i=……

多核处理器就运行不出12的结果。 还是需要点限制的。 --------------------编程问答-------------------- 12楼碉堡 --------------------编程问答-------------------- Java只支持单继承,一个类只能继承一个父类,但是一个类可以实现多个借口,
借口实现多线程就是弥补JAVA不能实现多继承的不足!!! --------------------编程问答-------------------- 我面试时候也问题了,还问我用什么方法启动线程?我说用start方法,他反问我为什么重写的是run方法,启动用start,那时候我蒙了,求解答 --------------------编程问答--------------------
引用 20 楼 makeppy 的回复:
引用 19 楼 monghuan 的回复:

java没有多继承,使用实现Runnable接口方式,可以达到Extends其他类的同时,implements Runnable接口的效果。
个人理解,呵呵,其实我也是来看头像的。。。
头像\(^o^)/~好看不?

头像挺好看的,不过lz怎么还没结贴呢 --------------------编程问答--------------------
引用 45 楼 monghuan 的回复:
引用 20 楼 makeppy 的回复:
引用 19 楼 monghuan 的回复:

java没有多继承,使用实现Runnable接口方式,可以达到Extends其他类的同时,implements Runnable接口的效果。
个人理解,呵呵,其实我也是来看头像的。。。
头像\(^o^)/~好看不?

头像挺好看的,不过lz怎么还没结贴呢
喜欢吗?那是我媳妇啊,哈哈,易做图呢 --------------------编程问答--------------------
引用 12 楼 chianfirstli 的回复:
如果一个类通过继承Thread来实现多线程的话,则不适合多个线程共享资源,而通过实现Runnable就可以做到这一点,下面给lz举个例子:
Java code

class MyTheard extends Thread{
    private int num = 5;//不能声明为静态的全局变量
    public void run(){
        for(int i=0;i<1……
  记住这个例子  很能说明问题  也很经典
--------------------编程问答--------------------
引用 44 楼 dctao114 的回复:
我面试时候也问题了,还问我用什么方法启动线程?我说用start方法,他反问我为什么重写的是run方法,启动用start,那时候我蒙了,求解答
 说白了run 就是一个对象  而 start是调这个对象的方法  你觉得呢? --------------------编程问答--------------------
引用 48 楼 h_ch19910205 的回复:
引用 44 楼 dctao114 的回复:

我面试时候也问题了,还问我用什么方法启动线程?我说用start方法,他反问我为什么重写的是run方法,启动用start,那时候我蒙了,求解答
 说白了run 就是一个对象  而 start是调这个对象的方法  你觉得呢?
我觉得不是呢,重写的run因为是接口的限制,同时run是个回调函数,start是个“通知”的消息,回调的好处是给了线程的时间准备,就是当XX完成的时候,doXX,当线程对象准备完毕的时候调用run,start仅仅是告诉线程对象的一个通知,个人理解。 --------------------编程问答-------------------- 我 觉得楼主 头像 比问题更火....
回头 我也整个 美女头像!谁让干咱们这行 女生那么少呢!
--------------------编程问答--------------------
引用 1 楼 goldenfish1919 的回复:
没区别,本质上是一样的。

但是,java语言只支持单继承,但是可以实现多个接口,因此,实现接口相对来说比较灵活!


++++ --------------------编程问答-------------------- 回帖内容很是丰富 收藏..  --------------------编程问答-------------------- 强帖啊!!
--------------------编程问答-------------------- Java 中不能实现什么多线程。只能给线程创建执行的任务。 --------------------编程问答-------------------- Thread类包装方法多,但不灵活,runnable接口,灵活,通常这个二个都是结合起来使用的, --------------------编程问答-------------------- Runable更加面向对象 --------------------编程问答--------------------
引用 54 楼 bao110908 的回复:
Java 中不能实现什么多线程。只能给线程创建执行的任务。
hi,大牛你好,你的意思我不是很明白呢.可以说的详细一点或是换个说法不? --------------------编程问答-------------------- 一个是extends Thread类,JAVA只能支持单继承,就是说,一个类只能继承自一个父类,但是,如果使用implements实现Runnable接口,就相当于实现了多重继承,更加的灵活。实际开发中,只要能用第二种,就尽量不用第一种。
然后,还有一个小问题就是,实现Runnable接口,他里面只有一个Run()方法,你必须new Thread(实现接口的类的实例化对象).start();这样才能调用run()方法。接口中没有start()方法。
应该就这些了。我能想到的。呵呵。 --------------------编程问答--------------------
引用 54 楼 bao110908 的回复:
Java 中不能实现什么多线程。只能给线程创建执行的任务。


期待你接下来的解析~~ --------------------编程问答-------------------- 找知识了 --------------------编程问答--------------------
引用 57 楼  的回复:
引用 54 楼 bao110908 的回复:

Java 中不能实现什么多线程。只能给线程创建执行的任务。
hi,大牛你好,你的意思我不是很明白呢.可以说的详细一点或是换个说法不?

多线程是Java内部的一种机制(不是你创建的),但它执行的任务是你创建的。目前它的任务基本有两种方式创建:
1、实现Runnable
2、继承Thread --------------------编程问答--------------------
引用 49 楼  的回复:
引用 48 楼 h_ch19910205 的回复:

引用 44 楼 dctao114 的回复:

我面试时候也问题了,还问我用什么方法启动线程?我说用start方法,他反问我为什么重写的是run方法,启动用start,那时候我蒙了,求解答
说白了run 就是一个对象  而 start是调这个对象的方法  你觉得呢?
我觉得不是呢,重写的run因为是接口的限制,同时run是个回调函数……

个人感觉,线程启动需要调用系统资源,而run方法是纯调用业务逻辑,从源码也可以看出,start方法调用jni的start0方法,去准备好系统资源,再执行run方法
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,