为了账号安全,请及时绑定邮箱和手机立即绑定

关于runnalbe 和thread 的区别

两个都可覆写run 方法,什么时候一个类需要定义成线程,什么时候需要定义成runnable?这两者各自的用法和区别俺没搞清楚,求指点

正在回答

2 回答

这个等到后边你学习了同步机制就知道了,实现的方式需要一个this关键字,而继承的时候你在用this的时候,因为创建了多个实例化对象,就不能用this了,涉及到共享数据.共享数据只能有一个.这里给你看个代码望采纳:

package com.atguigu.java;


//使用实现Runnable接口的方式售票

/*

 * 此程序存在线程的安全问题,打印车票时,会出现重票,错票

 * 1.线程安全问题存在的原因?

 * 由于一个线程在操作共享数据过程中,未执行完毕的情况下,另外的线程参与进来,导致

 * 共享数据存在了安全问题

 * 2.如何解决线程的安全问题?

 * 必须让一个线程操作共享数据完毕以后,其他线程才有机会参与共享数据的操作.

 * 

 * 3.java如何实现线程的安全,线程的同步机制

 * 方式一:同步代码块

 * synchronized(同步监视器){

 * //需要被同步的代码块(即为操作共享数据的代码)

 * }

 * 1.共享数据:多个线程共同操作的同一个数据(变量)

 * 2.同步监视器:由任何一个类的对象来充当.哪个线程 获取此监视器,谁就执行大括号里被

 *  同步的代码.俗称锁.

 * 要求:所有的线程必须公用同一把锁!

 *  注:在实现的方式中,考虑同步的话,可以使用this来充当,但是在继承的方式中,慎用this

 * 方法二:同步方法

 * 

 */

class Window2 implements Runnable {

int ticket = 100;// 共享数据

//Object obj = new Object();


public void run() {

while (true) {

synchronized (this) {//this表示当前对象,本问题中为w

if (ticket > 0) {

try {

Thread.currentThread().sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + "票号为:" + ticket--);

}

}

}

}

}


public class TestWindow2 {

public static void main(String[] args) {

Window2 w1 = new Window2();

Thread t1 = new Thread(w1);

Thread t2 = new Thread(w1);

Thread t3 = new Thread(w1);

t1.setName("窗口1");

t2.setName("窗口2");

t3.setName("窗口3");

t1.start();

t2.start();

t3.start();

}

}


0 回复 有任何疑惑可以回复我~

在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

避免点继承的局限,一个类可以继承多个接口。

适合于资源的共享

0 回复 有任何疑惑可以回复我~
#1

红袖侍读 提问者

老实说这些抽象笼统的概念我也知道,关键是对这些概念的理解不透彻。你说的第一个好处,大概可以理解为假如一个类已经继承了别的类,这时候就无法继承thread,要实现多线程就只有implements runnable,这是runnable接口比继承thread灵活的地方。但是第二个更适合资源共享要怎么理解,你能否举出一个具体的例子加以说明?
2016-06-23 回复 有任何疑惑可以回复我~
#2

红袖侍读 提问者

在网上搜了很多相关资料,目前结论是runnable只具备第一点优势,第二点优势并不存在,网传说明资源共享的售票例子的写法是错误的,实际上稍作改动thread继承类一样可以实现资源的共享
2016-06-23 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

关于runnalbe 和thread 的区别

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信