java中的Runnable类是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的Runnable类是啥意思?相关的知识,希望对你有一定的参考价值。

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;

·Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的

run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限,

下面看例子:
package org.thread.demo;
class MyThread extends Thread
private String name;
public MyThread(String name)
super();
this.name = name;

public void run()
for(int i=0;i<10;i++)
System.out.println("线程开始:"+this.name+",i="+i);



package org.thread.demo;
public class ThreadDemo01
public static void main(String[] args)
MyThread mt1=new MyThread("线程a");
MyThread mt2=new MyThread("线程b");
mt1.run();
mt2.run();


但是,此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。在

jdk 的文档中可以发现,一旦调用start()方法,则会通过JVM找到run()方法。下面启动

start()方法启动线程:
package org.thread.demo;
public class ThreadDemo01
public static void main(String[] args)
MyThread mt1=new MyThread("线程a");
MyThread mt2=new MyThread("线程b");
mt1.start();
mt2.start();

;这样程序可以正常完成交互式运行。那么为啥非要使用start();方法启动多线程呢?
在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方

法的定义,可以发现此方法中使用了private native void start0();其中native关键字表

示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(java Native Interface)

·Runnable接口
在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成。
public interface Runnable
public void run();

例子:
package org.runnable.demo;
class MyThread implements Runnable
private String name;
public MyThread(String name)
this.name = name;

public void run()
for(int i=0;i<100;i++)
System.out.println("线程开始:"+this.name+",i="+i);


;
但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察

Thread类,有一个构造方法:public Thread(Runnable targer)
此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多

线程。(start()可以协调系统的资源):
package org.runnable.demo;
import org.runnable.demo.MyThread;
public class ThreadDemo01
public static void main(String[] args)
MyThread mt1=new MyThread("线程a");
MyThread mt2=new MyThread("线程b");
new Thread(mt1).start();
new Thread(mt2).start();



· 两种实现方式的区别和联系:
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比

继承Thread类有如下好处:->避免点继承的局限,一个类可以继承多个接口。
->适合于资源的共享
以卖票程序为例,通过Thread类完成:
package org.demo.dff;
class MyThread extends Thread
private int ticket=10;
public void run()
for(int i=0;i<20;i++)
if(this.ticket>0)
System.out.println("卖票:ticket"+this.ticket--);



;
下面通过三个线程对象,同时卖票:
package org.demo.dff;
public class ThreadTicket
public static void main(String[] args)
MyThread mt1=new MyThread();
MyThread mt2=new MyThread();
MyThread mt3=new MyThread();
mt1.start();//每个线程都各卖了10张,共卖了30张票
mt2.start();//但实际只有10张票,每个线程都卖自己的票
mt3.start();//没有达到资源共享


如果用Runnable就可以实现资源共享,下面看例子:
package org.demo.runnable;
class MyThread implements Runnable
private int ticket=10;
public void run()
for(int i=0;i<20;i++)
if(this.ticket>0)
System.out.println("卖票:ticket"+this.ticket--);




package org.demo.runnable;
public class RunnableTicket
public stati
参考技术A 首先,Runnable 是Java 用来实现多线程的接口。
PS:Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口.
在使用Thread的时候只需要new一个实例出来,调用start()方法即可以启动一个线程。
Thread Test = new Thread();
Test.start();

在使用Runnable的时候需要先new一个继承Runnable的实例,之后用子类Thread调用。
Test impelements Runnable
Test t = new Test();
Thread test = new Thread(t);

在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。
实现Runnable接口相比 继承Thread类有如下好处:
  ->避免点继承的局限,一个类可以继承多个接口。
  ->适合于资源的共享
参考技术B Runnable是Thread的接口,在大多数情况下“推荐用接口的方式”生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合继承。

在使用Thread的时候只需要new一个实例出来,调用start()方法即可以启动一个线程。
Thread Test = new Thread();
Test.start();

在使用Runnable的时候需要先new一个继承Runnable的实例,之后用子类Thread调用。
Test impelements Runnable
Test t = new Test();
Thread test = new Thread(t);

在某个题目里,需要分别打印出a与b各10次,并且每打印一次a睡1秒,打印一次b睡2秒。

可以在run方法外面定义String word与int time
之后用
Thread t1 = new Thread();
Thread t2 = new Thread();

t1.word = "a"
t1.time = 1000

t2.Word = "b"
t2.time = 2000

t1.start();
t2.start();

----Runnable的代码

class T implements Runnable
String s = "";
int time = 0;
public void run ()
for (int i=0;i<10;i++)
try
Thread.sleep(time);
catch (InterruptedException e)
Thread.interrupted();

System.out.println(s);



public class Test
public static void main(String[] args)
T t1 = new T();
T t2 = new T();
t1.s = "a";
t1.time = 100;
t2.s = "b";
t2.time = 200;
Thread a = new Thread(t1);
a.start();
Thread b = new Thread(t2);
b.start();


参考技术C java语言中定义线程的接口类,推荐你本不错的java书《java就业培训教材》书,清华大学出版的

Android service 中的stub类是啥意思?

如题

stub是为了方便client,service交互而生成出来的代码。
AIDL(android 接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。如果你需要在一个进程中(例如:在一个Activity中)访问另一个进程中(例如:一个Service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数。
要使用AIDL,Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了。
交互过程client<-->proxy<-->stub<-->service

stub和proxy是为了方便client/service交互而生成出来的代码,这样client/service的代码就会比较干净,不会嵌入很多很难懂的与业务无关的代码
参考技术A (其1)巴迪(白俄斯1) 在首回合以2比3落,今次是自07/08年第1圈外出局後,首次取得洲格,中外援主要自克地及尼日利,但中未有球代表家上,中古巴迪曾是尼日利u20成,首回合在完前7分入替。至於首回合取得入球的前哥斯杜夫斯基及中史彭奴域,以往分代表其青年出。 巴迪上季成6霸,不在分得2和4出局,容方面,前雷巴甸尼及利域斯基代表白俄斯家上,中在巴西出生的雷巴甸尼上季攻入13球成神射手,惟未有在上仗落,利域斯基在首回合先。另外,曾被外借至弗堡的前迪洛夫,同曾白俄斯家出,上仗完前梅二度。 上一篇分析: 欧冠杯报料:希尔星堡 vs tns全网络下一篇分析: 没有了 赞助商 新鲜出炉 欧冠杯报料:华达 vs 巴迪 欧冠杯报料:希尔星堡 vs tns全网络 自由杯报料:塔库里 vs 科布雷洛 自由杯报料:丹奴比奥 vs 奥林比亚 欧冠杯报料:卡拉简迪 vs 利巴域 欧冠杯报料:基尔史莫纳 vs 斯利纳 欧冠杯报料:萨尔茨堡 vs 杜迪兰治 日乙报料:草津温泉 vs 町田zelvia 日乙报料:京都不死鸟 vs 爱媛fc 日乙报料:市原千叶 vs 甲府风林 参考技术B stub是为了方便client,service交互而生成出来的代码。这样client,service的代码就会比较干净,不会嵌入很多很难懂的与业务无关的代码。

具体用到过程:
提供客户机应用程序桩类型激发时所需要的定义和其他CORBA供应商相关的信息。
1.程序激发请求时所需要的一套例程。
2.把一个对象类型的IDL操作定义映射到激发请求时所要调用的一套与编程语言相关的例程
3 STUB,STYLE要求客户应用程序连接进客户桩
参考技术C stub是aidl的具体实现。aidl安卓接口定义语言,主要是实现进程间通信,stub在服务端实现接口的功能,另外在客户端是proxy与之通信 参考技术D service的东西确实还是要花些时间去理解的

以上是关于java中的Runnable类是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

java中implements是啥意思?在啥时候使用?

Android service 中的stub类是啥意思?

JAVA工具类是啥意思????怎么才能知道它是否工具或是其它类的工具类?

java中,实体类是啥意思

JAVA中的泛型类是啥东西?

Java多线程是啥意思?