`
dzl84394
  • 浏览: 57947 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Runnable 和 Thread

 
阅读更多

声明:又要换工作了,该死的面试题总是问这些个问题,我网上找一些资料,备忘,经此而已

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 开发人员完全避开多线程应用程序的设计和开发,即使用并发和并行的方式对系统进行建模会非常棒,他们也不使用多线程。



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics