什么情况下只能用Runable不能用Thread?

时间:2022-08-11 19:07:36
今天金蝶校招面试时被问到了什么情况下只能用Runable不能用Thread。不是说完全就不能用了,只是说用Thread的话会出现问题。 然后面试官提示说你们学习的时候或者你们老师应该都会讲这个问题。。。我印象中老师只讲过区别,实现Runable更好,但是貌似没有讲过用Thread会出问题。。请教一下各位!

还问了个问题,JVM里面的三种ClassLoader。。然后又问了下JVM参数如何设置,如何设置最大最小内存。。然后,我就不会了。。面试官见我不会就问了下JVM的默认内存是多大。。这个,,,我也不知道了。。学了这么久的Java,居然不知道JVM默认内存大小。印象中好像看到过时64M,不知道对不对。。

16 个解决方案

#1


第一个问题这个讲的还算清楚: http://www.oschina.net/question/565065_86563

JVM的Heap分配可以使用-X参数设定,

-Xms
初始Heap大小

-Xmx
java heap最大值 

-Xmn
young generation的heap大小 

#2


thread只能继承(extends),runable是实现(inplements),一个类可以实现多个接口,却只能继承一个类。。。

#3


引用 1 楼 huxiweng 的回复:
第一个问题这个讲的还算清楚: http://www.oschina.net/question/565065_86563

JVM的Heap分配可以使用-X参数设定,

-Xms
初始Heap大小

-Xmx
java heap最大值 

-Xmn
young generation的heap大小 

一个是多个线程完成一个活。。
一个是多个线程自己干自己的活。。是这么理解么?

还有,问下,默认的JVM内存是多少呢?

#4


引用 2 楼 hjw506848887 的回复:
thread只能继承(extends),runable是实现(inplements),一个类可以实现多个接口,却只能继承一个类。。。

您说的是面试官问得第一个问题,我还是说出来了。
他问得是什么情况下只能用Runable,用Thread可能会出问题。。这个问题我没有回答出来。

#5


引用 3 楼 ifvlr 的回复:
Quote: 引用 1 楼 huxiweng 的回复:

第一个问题这个讲的还算清楚: http://www.oschina.net/question/565065_86563

JVM的Heap分配可以使用-X参数设定,

-Xms
初始Heap大小

-Xmx
java heap最大值 

-Xmn
young generation的heap大小 

一个是多个线程完成一个活。。
一个是多个线程自己干自己的活。。是这么理解么?

还有,问下,默认的JVM内存是多少呢?


默认好像是64吧

#6


ClassLoader三种
分别是
bootstrapclassloader//这东西不是java写的
ExtClassLoader
AppClassLoader
写一个小程序

public Test() {
ClassLoader classLoader1 = this.getClass().getClassLoader();
ClassLoader classLoader2 = this.getClass().getClassLoader().getParent();
ClassLoader classLoader3 = this.getClass().getClassLoader().getParent().getParent();
System.out.println(classLoader1);
System.out.println(classLoader2);
System.out.println(classLoader3);
}

输出
sun.misc.Launcher$AppClassLoader@193a66f
sun.misc.Launcher$ExtClassLoader@93d6bc
null

#7


至于楼主的问题:
百度第一个
http://www.oschina.net/question/565065_86563
什么情况下只能用Runable不能用Thread?

#8


Runable和thread的区别(多线程必须用Runable) - 微风夜明
http://www.tuicool.com/articles/juMre2

#9


默认64M


因为java单继承的机制  所以在已经形成继承结构的情况下  只能使用接口实现

#10


要多线程必须用private native void start0();否则都是在跑普通方法
"只能用Runable不能用Thread"意思应该说的是线程池吧,ThreadPoolExecutor 把线程当成Runable在处理,比如你创建的线程优先级你自己设过了,线程池是不会管你自己设置的优先级的,还有告诉你两个线程的知识点,优先级可以在线程开始跑后再重新设置优先级,Thread.currentThread().setPriority(),但守护线程只能在线程start前设置

#11


这面试还有点难度啊,呵呵 

#12


继续关注java开发!

#13


该回复于2013-11-02 09:32:36被管理员删除

#14


继续关注java开发!

#15


引用 10 楼 qq331077064 的回复:
要多线程必须用private native void start0();否则都是在跑普通方法
"只能用Runable不能用Thread"意思应该说的是线程池吧,ThreadPoolExecutor 把线程当成Runable在处理,比如你创建的线程优先级你自己设过了,线程池是不会管你自己设置的优先级的,还有告诉你两个线程的知识点,优先级可以在线程开始跑后再重新设置优先级,Thread.currentThread().setPriority(),但守护线程只能在线程start前设置

非常感谢您的回答,不过当时面试官给我的提示是说用Thread买票时可能会出现买出负数的情况,问我具体是什么情况之类的。。。

#16


不同线程访问相同资源,解决办法,加锁(显式锁,和隐式锁),用原子类

#1


第一个问题这个讲的还算清楚: http://www.oschina.net/question/565065_86563

JVM的Heap分配可以使用-X参数设定,

-Xms
初始Heap大小

-Xmx
java heap最大值 

-Xmn
young generation的heap大小 

#2


thread只能继承(extends),runable是实现(inplements),一个类可以实现多个接口,却只能继承一个类。。。

#3


引用 1 楼 huxiweng 的回复:
第一个问题这个讲的还算清楚: http://www.oschina.net/question/565065_86563

JVM的Heap分配可以使用-X参数设定,

-Xms
初始Heap大小

-Xmx
java heap最大值 

-Xmn
young generation的heap大小 

一个是多个线程完成一个活。。
一个是多个线程自己干自己的活。。是这么理解么?

还有,问下,默认的JVM内存是多少呢?

#4


引用 2 楼 hjw506848887 的回复:
thread只能继承(extends),runable是实现(inplements),一个类可以实现多个接口,却只能继承一个类。。。

您说的是面试官问得第一个问题,我还是说出来了。
他问得是什么情况下只能用Runable,用Thread可能会出问题。。这个问题我没有回答出来。

#5


引用 3 楼 ifvlr 的回复:
Quote: 引用 1 楼 huxiweng 的回复:

第一个问题这个讲的还算清楚: http://www.oschina.net/question/565065_86563

JVM的Heap分配可以使用-X参数设定,

-Xms
初始Heap大小

-Xmx
java heap最大值 

-Xmn
young generation的heap大小 

一个是多个线程完成一个活。。
一个是多个线程自己干自己的活。。是这么理解么?

还有,问下,默认的JVM内存是多少呢?


默认好像是64吧

#6


ClassLoader三种
分别是
bootstrapclassloader//这东西不是java写的
ExtClassLoader
AppClassLoader
写一个小程序

public Test() {
ClassLoader classLoader1 = this.getClass().getClassLoader();
ClassLoader classLoader2 = this.getClass().getClassLoader().getParent();
ClassLoader classLoader3 = this.getClass().getClassLoader().getParent().getParent();
System.out.println(classLoader1);
System.out.println(classLoader2);
System.out.println(classLoader3);
}

输出
sun.misc.Launcher$AppClassLoader@193a66f
sun.misc.Launcher$ExtClassLoader@93d6bc
null

#7


至于楼主的问题:
百度第一个
http://www.oschina.net/question/565065_86563
什么情况下只能用Runable不能用Thread?

#8


Runable和thread的区别(多线程必须用Runable) - 微风夜明
http://www.tuicool.com/articles/juMre2

#9


默认64M


因为java单继承的机制  所以在已经形成继承结构的情况下  只能使用接口实现

#10


要多线程必须用private native void start0();否则都是在跑普通方法
"只能用Runable不能用Thread"意思应该说的是线程池吧,ThreadPoolExecutor 把线程当成Runable在处理,比如你创建的线程优先级你自己设过了,线程池是不会管你自己设置的优先级的,还有告诉你两个线程的知识点,优先级可以在线程开始跑后再重新设置优先级,Thread.currentThread().setPriority(),但守护线程只能在线程start前设置

#11


这面试还有点难度啊,呵呵 

#12


继续关注java开发!

#13


该回复于2013-11-02 09:32:36被管理员删除

#14


继续关注java开发!

#15


引用 10 楼 qq331077064 的回复:
要多线程必须用private native void start0();否则都是在跑普通方法
"只能用Runable不能用Thread"意思应该说的是线程池吧,ThreadPoolExecutor 把线程当成Runable在处理,比如你创建的线程优先级你自己设过了,线程池是不会管你自己设置的优先级的,还有告诉你两个线程的知识点,优先级可以在线程开始跑后再重新设置优先级,Thread.currentThread().setPriority(),但守护线程只能在线程start前设置

非常感谢您的回答,不过当时面试官给我的提示是说用Thread买票时可能会出现买出负数的情况,问我具体是什么情况之类的。。。

#16


不同线程访问相同资源,解决办法,加锁(显式锁,和隐式锁),用原子类