为什么实现了runnable接口的run方法就能多线程了? 这是人家设计语言的人规定的吧实现runable或者继承thread就算是线程类了,至于你急着想知道为什么,先多用几次,看看书上的一些实例估计就不会那么抽象了吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 run()方法在每个线程启动时都会首先执行,启动几个线程就有几个线程去执行这个run()方法。run()方法是Runnabl接口的抽象方法。实现Runnabl接口就必须实现它的方法,而这个方法就是线程的入口。 准确的说实现了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方法里的任务 再看一下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方法里的任务 因为Thread的run方法是调用Runnable的run方法的 Thread类是implements了Runnable接口;调用的run()方法,其实就是Thread类中的run()方法;代理设计模式啊! 不好意思,刚才给打错了,Thread类是implements了Runnable接口;调用的start()方法,其实就是Thread类中的start()方法;代理设计模式。 start()方法调用start0() 方法来开始争抢系统资源。 至于怎么争抢系统资源就是操作系统的事了,我们只要准备好了Thread类的对象,并通过start0()这个开关,使Thread类的对象开始争抢系统资源就行了。 那就是说start0就是最底层代码,至于start0是怎么实现的就没法知道了吗? 多线程实现的两种方式是:Thread和Raunable. 不能。线程要调用run方法而已。 那就是说start0就是最底层代码,至于start0是怎么实现的就没法知道了吗?是的,并且这个方法肯定不是用java实现的 有一本书叫《深入Java虚拟机》之前我记得是第二版,没看下去,里面有讲类加载机制,不过仅仅是机制,如果你一定要探索最底层的代码,估计去看底层的C/C++(我猜大概是这两种的),不过在《深入Java虚拟机》里面也有些底层机制,可以去学习下,不过没有源码。 模板方法 socket编程使用BufferedReader的readLine方法问题 spring+tuscany问题——spring-sca.xsd 的地址是啥 如何隐藏JTABPANEL的标题? 有谁遇到过java把服务器弄宕机的 向jpanel里添加的组件多了后,如何出现滚动条呢 关于按值传送,忘高手解答。本人初学者 GUI最很基础的问题 用编程语言写一个在局域网里检测DHCP主机的小工具? jpopup menu 能够横过来吗? 怎么优化该递归? Java 中如何判断一个类是线程安全的?
run()方法是Runnabl接口的抽象方法。实现Runnabl接口就必须实现它的方法,而这个方法就是线程的入口。
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方法里的任务
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方法里的任务
是的,并且这个方法肯定不是用java实现的