为什么实现了runnable接口的run方法就能多线程了?

zychere 2014-11-12 05:12:18
一直有个问题很疑惑,很多东西知道怎么用,但是不知道为什么。。。

比如为什么实现了runnable接口的run方法就能多线程了?看run方法的源代码也没看明白,他怎么就实现了多线程了呢?最底层的代码写在哪?

类似的还有serializable接口,怎么实现了他就能序列化了呢?最低层代码写在哪?

谢谢!
...全文
4896 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
tsx8136 2016-05-10
  • 打赏
  • 举报
回复 1
楼主太牛想要看底层的代码,但是Thread对象里告诉我们不让你看,因为java调用了dll文件的内容,是sun实现的具体用C还是C++不清楚,想要知道更多的只能去问sun了。
ForestDB 2014-11-14
  • 打赏
  • 举报
回复
run只是线程的入口而已
student-ai 2014-11-13
  • 打赏
  • 举报
回复
有一本书叫《深入Java虚拟机》之前我记得是第二版,没看下去,里面有讲类加载机制,不过仅仅是机制,如果你一定要探索最底层的代码,估计去看底层的C/C++(我猜大概是这两种的),不过在《深入Java虚拟机》里面也有些底层机制,可以去学习下,不过没有源码。
xingbear 2014-11-13
  • 打赏
  • 举报
回复
引用 12 楼 zychere 的回复:
[quote=引用 4 楼 xingbear 的回复:] 再看一下Thread类的start方法:

public synchronized void start() {
	if (threadStatus != 0)
		throw new IllegalThreadStateException();
	group.add(this);
	start0();
	if (stopBeforeStart) {
		stop0(throwableFromStop);
	}
}

private native void start0();
start0方法用的native关键字,百度了一下,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。 可以再看一下JDK的文档,关于Thread类的start方法的介绍: public void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 所以我觉得start0方法里应该就是做了让虚拟机调用该线程的 run 方法,也就是Thread类的run方法,也就执行了run方法里的任务
那就是说start0就是最底层代码,至于start0是怎么实现的就没法知道了吗?[/quote] 是的,并且这个方法肯定不是用java实现的
勿视人非 2014-11-13
  • 打赏
  • 举报
回复
这个问题就有点难了,就好像问人活着为什么要呼吸,为什么要喝水。
honeybee996 2014-11-13
  • 打赏
  • 举报
回复
至于怎么争抢系统资源就是操作系统的事了,我们只要准备好了Thread类的对象,并通过start0()这个开关,使Thread类的对象开始争抢系统资源就行了。
honeybee996 2014-11-13
  • 打赏
  • 举报
回复
start()方法调用start0() 方法来开始争抢系统资源。
honeybee996 2014-11-13
  • 打赏
  • 举报
回复
不好意思,刚才给打错了,Thread类是implements了Runnable接口;调用的start()方法,其实就是Thread类中的start()方法;代理设计模式。
猎魔人-不纯 2014-11-13
  • 打赏
  • 举报
回复
这应该有底层代码了吧,人家这么规定封装的,
honeybee996 2014-11-13
  • 打赏
  • 举报
回复
Thread类是implements了Runnable接口;调用的run()方法,其实就是Thread类中的run()方法;代理设计模式啊!
冥王之锤 2014-11-13
  • 打赏
  • 举报
回复
不能。线程要调用run方法而已。
meng020712 2014-11-13
  • 打赏
  • 举报
回复
多线程实现的两种方式是:Thread和Raunable.
zychere 2014-11-13
  • 打赏
  • 举报
回复
引用 4 楼 xingbear 的回复:
再看一下Thread类的start方法:

public synchronized void start() {
	if (threadStatus != 0)
		throw new IllegalThreadStateException();
	group.add(this);
	start0();
	if (stopBeforeStart) {
		stop0(throwableFromStop);
	}
}

private native void start0();
start0方法用的native关键字,百度了一下,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。 可以再看一下JDK的文档,关于Thread类的start方法的介绍: public void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 所以我觉得start0方法里应该就是做了让虚拟机调用该线程的 run 方法,也就是Thread类的run方法,也就执行了run方法里的任务
那就是说start0就是最底层代码,至于start0是怎么实现的就没法知道了吗?
taili963 2014-11-13
  • 打赏
  • 举报
回复
因为Thread的run方法是调用Runnable的run方法的
xingbear 2014-11-12
  • 打赏
  • 举报
回复
再看一下Thread类的start方法:

public synchronized void start() {
	if (threadStatus != 0)
		throw new IllegalThreadStateException();
	group.add(this);
	start0();
	if (stopBeforeStart) {
		stop0(throwableFromStop);
	}
}

private native void start0();
start0方法用的native关键字,百度了一下,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。 可以再看一下JDK的文档,关于Thread类的start方法的介绍: public void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 所以我觉得start0方法里应该就是做了让虚拟机调用该线程的 run 方法,也就是Thread类的run方法,也就执行了run方法里的任务
xingbear 2014-11-12
  • 打赏
  • 举报
回复
准确的说实现了Runnable的类只是定义了一个任务,一般还要把实现了Runnable的类的对象传递给一个Thread对象才能开启线程:

Runnable r=new Runnable(){
	public void run() {
		while(true){
			System.out.println("1111");
		}                
	}
}
Thread t = new Thread(r);
t.start();
或者下面的形式也可以开启一个线程,也就是重写Thread类的run方法:

class First extends Thread{
	public void run(){
		while(true){
			System.out.println("11111111");
		}
	}
}
public class Test{
	public static void main(String []args){
		Thread t=new First();
		t.start();		
	}
}
你可以再看一下Thread类的源代码:

private Runnable target;

public Thread(Runnable target) {
	init(null, target, "Thread-" + nextThreadNum(), 0);
}

private void init(ThreadGroup g, Runnable target, String name, long stackSize) {
	//其它代码	
	this.target = target;
	//其它代码
}

public void run() {
	if (target != null) {
		target.run();
	}
}
所以使用第一种方式开启线程的时候,target就是构造方法传过来的Runnable对象,就会去执行target的run方法,也就是Runnable对象的任务,如果是第二种方式,则执行已经重写过的run方法里的任务
code小生 2014-11-12
  • 打赏
  • 举报
回复
run()方法在每个线程启动时都会首先执行,启动几个线程就有几个线程去执行这个run()方法。 run()方法是Runnabl接口的抽象方法。实现Runnabl接口就必须实现它的方法,而这个方法就是线程的入口。
  • 打赏
  • 举报
回复
这是人家设计语言的人规定的吧。。。实现runable或者继承thread就算是线程类了,至于你急着想知道为什么,先多用几次,看看书上的一些实例估计就不会那么抽象了吧。。。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧