声明:又要换工作了,该死的面试题总是问这些个问题,我网上找一些资料,备忘,经此而已
1,介绍runnable
先new一个继承Runnable的实例,之后用子类Thread调用
class MyRunnable implements Runnable{
String name;
MyRunnable(String name){
this.name = name;
}
public void run() {
for (int i = 1; i < 10; i++) {
System.err.println(name +" : " + i);
}
}
}
public class Thread1 {
public static void main(String[] args) {
MyRunnable myr = new MyRunnable("dzl");
Thread t = new Thread(myr);
t.start();
}
}
2,Thread
thread 也实现了runnable接口 所以实例化一个thread, 覆盖run方法也可以
class MyThread extends Thread{
public void run() {
for (int i = 1; i < 10; i++) {
System.out.println(super.getName() + " : " + i);
}
}
}
public class Thread2 {
public static void main(String[] args) {
MyThread mt1 = new MyThread();
mt1.start();
}
}
3,区别
1)由于Java 技术只允许单一继承,所以如果你已经继承了Thread,你就不能再继承其它任何类,例如Applet。
2)当一个run()方法体现在继承Thread 类的类中,用this 指向实际控制运行的Thread实例。因此,代码不再需要使用如下控制:
Thread.currentThread().join();
而可以简单地用:
join();
Runnable是Thread的接口,俺在大多数情况下“推荐用接口的方式”生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合继承。
4,缺点:
死锁
死锁 的情况是指:线程由于等候某种条件变成真(例如资源可以使用),但是它等候的条件无法变成真,因为能够让条件变成真的线程在等候第一个线程“做某件事”。这样,两个线程都在等候对方先采取第一步,所以都无法做事。
资源耗尽
资源耗尽,又称为 线程耗尽,是 Java 语言的 wait/notify 原语无法保证 live-ness 的后果。Java 强制这些方法要拥有它们等候或通知的对象的锁。在某个线程上调用的 wait() 方法在开始等候之前必须释放监视器锁,然后在从方法返回并获得通知之后,必须再次重新获得锁。因此,Java 语言规范在锁本身之外,还描述了一套与每个对象相关的 等候集(wait set)。一旦线程释放了对象上的锁(在 wait 的调用之后),线程就会放在这个等候集上。
多数 JVM 实现把等候线程放在队列中。所以,如果在通知发生的时候,还有其他线程在等候监视器,那么就会把一个新线程放在队列尾部,而它并不是下一个获得锁的线程。所以,等到被通知线程实际得到监视器的时候,通知该线程的条件可能已经不再为真,所以它不得不再次 wait。这种情况可能无限持续下去,从而造成运算工作上浪费(因为要反复把该线程放入等候集和从中取出)和线程耗尽。
对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。
公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。
多线程 Java 程序容易发生的错误非常不明显,有可能在任意什么时候发生。另一方面,完全有可能这些 bug 在程序中从不出现。问题取决于一些不可知的因素。多线程程序的复杂本质,使得人们很难有效地对其进行验证。没有一套现成的规则可以找出多线程代码中的这类问题,也无法确切地证明这些问题不存在,这些导致许多 Java 开发人员完全避开多线程应用程序的设计和开发,即使用并发和并行的方式对系统进行建模会非常棒,他们也不使用多线程。
分享到:
相关推荐
在Java编程语言中,多线程的实现有多种方式,其中最常见的是通过继承`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景,理解它们之间的区别对于编写高效、可维护的多线程应用至关重要。 ### 继承...
在创建线程时,我们通常会遇到两种主要的方式:实现`Runnable`接口和继承`Thread`类。虽然两者都能实现多线程,但它们之间存在着重要的区别,这些差异主要体现在设计模式、内存共享、线程的创建以及线程的生命周期...
在Java编程语言中,创建和管理多线程有两种主要的方式:继承`Thread`类和实现`Runnable`接口。这两种方式都是为了实现并发执行任务,但它们之间存在一些关键的区别。 首先,当我们创建一个新的线程时,实际上是为了...
在Java编程语言中,创建多线程有两种主要的方式:继承`Thread`类和实现`Runnable`接口。这两种方法都有其特点和适用场景,下面我们详细分析它们的优缺点。 首先,让我们看看继承`Thread`类的方法。`Thread`类是Java...
### 多线程的Runnable与Thread的区别 在Java中实现多线程有两种主要方式:一种是继承`Thread`类;另一种是实现`Runnable`接口。本文将深入探讨这两种方法的区别,帮助初学者更好地理解并选择适合场景的多线程实现...
有两种主要的方式可以实现多线程:继承`Thread`类和实现`Runnable`接口。这两种方法各有特点,适用于不同的场景。 **继承Thread类** 当一个类直接继承自`Thread`类时,这个类本身就成为一个线程实体。你可以重写`...
"认识Thread和Runnable" Thread 和 Runnable 是 Java 中实现多线程的两种方式。继承 Thread 类或者实现 Runnable 接口可以实现多线程。Runnable 接口建议使用,因为它可以实现多继承,并且只有一个 run 方法,很...
Thread 线程类是 Java 中 Thread 和 Runnable 接口的实现,它提供了线程的基本操作和管理。下面是对 Thread 类的详细介绍: 1. Runnable 接口 Runnable 接口是 Thread 类的基类,它提供了 run() 方法,该方法是...
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。
Handler、Runnable和Thread都是实现多线程的方式,但它们之间有着不同的使用场景和特点。 1. 继承Thread类: 当一个类直接继承自Thread类时,可以直接覆写run()方法来实现多线程。这种方式的缺点是类的继承性受到...
本篇文章将深入探讨如何利用`Thread`类和`Runnable`接口来实现阶乘计算的多线程解决方案。阶乘计算是数学中的一个概念,对于非负整数n,其阶乘表示为所有小于等于n的正整数的乘积,记作n!。 首先,我们来看如何使用...
合理利用AsyncTask、Runnable、Thread、Handler、Looper、线程池和线程同步机制,能帮助开发者设计出更加健壮和高效的Android应用。在实际开发中,应根据任务特性和需求,选择最适合的线程管理方式。通过Demo实践,...
Java提供了两种创建线程的方式:继承Thread类和实现Runnable接口。 1. 继承Thread类创建线程: 当你选择继承Thread类时,你需要创建一个新的类,这个类扩展自Thread类。Thread类已经实现了Runnable接口,所以你不...
RunnableThread1.java
线程创建与启动介绍了如何使用Runnable和Thread接口创建和启动线程。 线程状态管理详细讲解了线程的六种状态(NEW、RUNNABLE、BLOCKED、WAITING、TIMEDWAITING、TERMINATED)及其转换。 线程属性讨论了线程的ID、...
总的来说,Java并发编程通过Runnable和Thread实现了简单的多线程执行,而Executor服务则提供了更高级的线程管理和调度。当需要处理任务结果时,Callable接口提供了返回值的能力。这些组件结合使用,可以构建出复杂、...
在Java中,实现多线程的两种主要方式分别是:**通过继承`Thread`类** 和 **实现`Runnable`接口**。下面将详细介绍这两种方式,并提供相应的示例程序。 #### 一、通过继承`Thread`类实现多线程 在Java中,可以通过...
详解Java中Thread和Runnable区别 Java中Thread和Runnable是两个不同的概念,它们都是Java中的线程机制,但是它们之间有着本质的区别。 Thread是Java中的一个类,而Runnable是一个接口。Thread类实现了Runnable接口...
接着文档中出现了Java编程语言中实现多线程编程的两个主要接口:Runnable和Thread。Runnable接口代表一个可以被线程执行的任务,而Thread类代表一个可以执行Runnable任务的线程。文档通过Animal类继承Thread来创建...