runnable(Java中Runnable和Thread的区别是什么)

:暂无数据 2026-09-11 16:20:02 0

runnable(Java中Runnable和Thread的区别是什么)

这篇文章给大家聊聊关于runnable,以及Java中Runnable和Thread的区别是什么对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

本文目录

Java中Runnable和Thread的区别是什么

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

Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

Java由四方面组成:

  1. Java编程语言,即语法。

  2. Java文件格式,即各种文件夹、文件的后缀。

  3. Java虚拟机(JVM),即处理*.class文件的解释器。

  4. Java应用程序接口(Java API)。

Java中Runnable和Thread的区别

java中有两种实现多线程的方式:


1. 一种是通过继承Thread类,同时重写run()方法。但是java中,只允许单继承,也就是一个类只能继承一个父类,使得该方式具有一定的局限性,等下就知道了。


2. 另一种是实现Runnable类接口的run()方法,再结合Thread类来实现多线程。
两种方式最终都是通过调用start()方法来实现多线程。切记不能直接调用Thread类或Runnable对象的run()方法,因为直接调用run()方法,只会执行同一个线程中的任务,而不会启动新线程。调用start()方法将会创建一个执行run()方法的线程。

Runnable和Thread区别

实际开发中我们通常采用Runnable接口来实现多线程。因为实现Runnable接口比继承Thread类有如下好处:


1. 避免继承的局限,一个类可以继承多个接口,但是类只能继承一个类。


2. Runnable接口实现的线程便于资源共享。而通过Thread类实现,各自线程的资源是独立的,不方便共享。

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 static void main(String args) {
MyThread mt=new MyThread();
new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一
new Thread(mt).start();//个实例化对象mt,就会出现异常
new Thread(mt).start();
}
};虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可
以达到资源共享目的。
·Runnable接口和Thread之间的联系:
public class Thread extends Object implements Runnable
发现Thread类也是Runnable接口的子类。

runnable和callable区别是什么

1、意义区别:

Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;

Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。

2、使用方法区别:

定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

举例说明:

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);
}

Java中Runnable和Thread的区别

Runnable接口和Thread类是java中实现多线程的两种方法。主要区别在于:Thread是类,而Runnable是接口。
抽象类和接口的区别如下:
1. 在类来继承抽象类时,只需实现部分具体方法和全部抽象方法,而实现接口则要实现里面的全部方法。
2. 在接口中无成员变量,而抽象类中可有成员变量。
在Java中引进接口主要是为了解决多继承的问题,实现多线程主要继承Thread 类和实现Runnable接口。

线程runnable和callable的区别

Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
1、通过实现Runnable接口来创建Thread线程:
步骤1:创建实现Runnable接口的类:

class SomeRunnable implements Runnable
{
public void run()
{
//do something here
}
}
步骤2:创建一个类对象:
Runnable oneRunnable = new SomeRunnable();
步骤3:由Runnable创建一个Thread对象:
Thread oneThread = new Thread(oneRunnable);
步骤4:启动线程:
oneThread.start();
至此,一个线程就创建完成了。
注释:线程的执行流程很简单,当执行代码oneThread.start();时,就会执行oneRunnable对象中的void run();方法,
该方法执行完成后,线程就消亡了。
2、与方法1类似,通过实现Callable接口来创建Thread线程:其中,Callable接口(也只有一个方法)定义如下:
public interface Callable《V》
{
V call() throws Exception;
}
步骤1:创建实现Callable接口的类SomeCallable《Integer》(略);
步骤2:创建一个类对象:
Callable《Integer》 oneCallable = new SomeCallable《Integer》();
步骤3:由Callable《Integer》创建一个FutureTask《Integer》对象:
FutureTask《Integer》 oneTask = new FutureTask《Integer》(oneCallable);
注释:FutureTask《Integer》是一个包装器,它通过接受Callable《Integer》来创建,它同时实现了Future和Runnable接口。
步骤4:由FutureTask《Integer》创建一个Thread对象:
Thread oneThread = new Thread(oneTask);
步骤5:启动线程:
oneThread.start();
至此,一个线程就创建完成了。
3、通过继承Thread类来创建一个线程:
步骤1:定义一个继承Thread类的子类:
class SomeThead extends Thraad
{
public void run()
{
//do something here
}
}
步骤2:构造子类的一个对象:
SomeThread oneThread = new SomeThread();
步骤3:启动线程:
oneThread.start();
至此,一个线程就创建完成了。
注释:这种创建线程的方法不够好,主要是因为其涉及运行机制问题,影响程序性能。
4、通过线程池来创建线程:
步骤1:创建线程池:
ExecutorService pool = Executors.newCachedThreadPool();
步骤2:通过Runnable对象或Callable对象将任务提交给ExecutorService对象:
Future《Integer》 submit(Callable《Integer》 task);
注释:Future是一个接口,它的定义如下:

public interface Future《T》
{
V get() throws ...;
V get(long timeout, TimeUnit unit) throws ...;
void cancle(boolean mayInterrupt);
boolean isCancelled();
boolean isDone();
}
至此,一个线程就创建完成了。
注释:线程池需调用shutdown();方法来关闭线程。
5、通过事件分配线程直接使用程序中的原有线程:
使用方法:
直接调用EventQueue类的静态方法invokeLater():
EventQueue.invokeLater(oneRunnable);
注释:调用EventQueue.invokeLater(oneRunnable);会直接执行oneRunnable对象中的run()方法

简答题实现runnable接口创建线程并在线程内提示线程名称等相关信息

实现Runnable接口创建线程的步骤如下:

  • 1.定义一个类,实现Runnable接口。


public class MyRunnable implements Runnable {

// 线程执行体

@Override

public void run() {

// 提示线程名称等相关信息

System.out.println("线程名称:" + Thread.currentThread().getName());

System.out.println("线程ID:" + Thread.currentThread().getId());

System.out.println("线程状态:" + Thread.currentThread().getState());

}

}


2、创建Runnable接口实现类的实例。

MyRunnable runnable = new MyRunnable();

3、创建Thread类的实例,并将Runnable接口实现类的实例作为参数传递给Thread类的构造方法。

Thread thread = new Thread(runnable);

4、调用Thread类的start()方法启动线程。

thread.start();


在线程内提示线程名称等相关信息,可以在Runnable接口实现类的run()方法中使用Thread类的currentThread()方法来获取当前线程的信息,然后通过getName()、getId()和getState()方法来获取线程名称、线程ID和线程状态,并打印到控制台。

public class Main {    public static void main(String args) {      

// 创建Runnable接口实现类的实例
       

MyRunnable runnable = new MyRunnable();       

// 创建Thread类的实例,并将Runnable接口实现类的实例作为参数传递给Thread类的构造方法 

Thread thread = new Thread(runnable); 

// 调用Thread类的start()方法启动线程 

thread.start();
}
}

class MyRunnable implements Runnable { 

// 线程执行体 

@Override
public void run() { 

// 提示线程名称等相关信息 

System.out.println("线程名称:" + Thread.currentThread().getName());
System.out.println("线程ID:" + Thread.currentThread().getId()); 

System.out.println("线程状态:" + Thread.currentThread().getState()); 

}

}

Java中Runnable和Thread以及Callable的区别

Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如果线程没有执行完,Future.get()方法可能会阻塞当前线程的执行;如果线程出现异常,Future.get()会throws InterruptedException或者ExecutionException;如果线程已经取消,会跑出CancellationException。取消由cancel 方法来执行。isDone确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明Future《?》 形式类型、并返回 null 作为底层任务的结果。Future接口的定义如下:
Future模式
Future模式在请求发生时,会先产生一个Future凭证给发出请求的客户,它的作用就像是Proxy物件,同时,由一个新的执行线程持续进行目标物件的生成(Thread-Per-Message),真正的目标物件生成之后,将之设定至Future之中,而当客户端真正需要目标物件时,目标物件也已经准备好,可以让客户提取使用。
结合JDK的Future来看,就是你run线程后,你可以把线程的返回值赋给Future并返回一个Future对象。这时你可以立即拿到这个对象,然后进行下面的逻辑。但是如果你要get这个Future中的线程结果,就会被阻塞直到线程结束。
就相当于现在的期房,你把手续和钱都交上去了,就可以马上拿到合同,但只有合同没有房子。这个时候你已经是有房一族了,你可以先去买家电买装修(走下面的其他逻辑)。但是你要把家电和装修放进去,就必须等到房子完工(阻塞)。

Java中Runnable和Thread的区别是什么的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Java中Runnable和Thread的区别是什么、Java中Runnable和Thread的区别是什么的信息别忘了在本站进行查找哦。

runnable(Java中Runnable和Thread的区别是什么)

本文编辑:admin

更多文章:


电脑管家怎么下载软件(微软电脑管家怎么下载软件)

电脑管家怎么下载软件(微软电脑管家怎么下载软件)

本篇文章给大家谈谈电脑管家怎么下载软件,以及微软电脑管家怎么下载软件对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年9月11日 19:00

socks5代理怎么设置(怎样设置socks代理)

socks5代理怎么设置(怎样设置socks代理)

大家好,如果您还对socks5代理怎么设置不太了解,没有关系,今天就由本站为大家分享socks5代理怎么设置的知识,包括怎样设置socks代理的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年9月11日 18:20

ps免费下载中文版免费(哪里可以下载到免费的photoshop)

ps免费下载中文版免费(哪里可以下载到免费的photoshop)

本篇文章给大家谈谈ps免费下载中文版免费,以及哪里可以下载到免费的photoshop对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年9月11日 18:10

runnable(Java中Runnable和Thread的区别是什么)

runnable(Java中Runnable和Thread的区别是什么)

这篇文章给大家聊聊关于runnable,以及Java中Runnable和Thread的区别是什么对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年9月11日 16:20

winrar永久免费版下载(想压缩文件,需要什么软件)

winrar永久免费版下载(想压缩文件,需要什么软件)

各位老铁们,大家好,今天由我来为大家分享winrar永久免费版下载,以及想压缩文件,需要什么软件的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

2026年9月11日 15:00

苹果a1278笔记本装win7(a1278安装win7没网卡)

苹果a1278笔记本装win7(a1278安装win7没网卡)

大家好,如果您还对苹果a1278笔记本装win7不太了解,没有关系,今天就由本站为大家分享苹果a1278笔记本装win7的知识,包括a1278安装win7没网卡的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年9月11日 14:50

话筒没声音是什么问题(麦克风没声音怎么回事)

话筒没声音是什么问题(麦克风没声音怎么回事)

大家好,如果您还对话筒没声音是什么问题不太了解,没有关系,今天就由本站为大家分享话筒没声音是什么问题的知识,包括麦克风没声音怎么回事的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年9月11日 14:10

win7制作系统镜像(win7系统怎么做镜像)

win7制作系统镜像(win7系统怎么做镜像)

本篇文章给大家谈谈win7制作系统镜像,以及win7系统怎么做镜像对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年9月11日 12:50

360路由器怎么登陆(360路由器手机登录入口)

360路由器怎么登陆(360路由器手机登录入口)

本篇文章给大家谈谈360路由器怎么登陆,以及360路由器手机登录入口对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年9月11日 11:20

oracle培训(oracle wdp授权机构哪个比较专业正规)

oracle培训(oracle wdp授权机构哪个比较专业正规)

本篇文章给大家谈谈oracle培训,以及oracle wdp授权机构哪个比较专业正规对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年9月11日 11:10

最近更新

endless中文什么意思(endness和endless的区别是什么)
2026-09-11 18:50:02 浏览:0
winscp(WinSCP怎么安装)
2026-09-11 17:50:02 浏览:0
热门文章

dessert(dessert是什么意思)
2026-05-03 12:45:03 浏览:7
标签列表