问答详情
源自:2-3 Java线程-隋唐演义实战开发---演员简介

关于runnalbe 和thread 的区别

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

提问者:红袖侍读 2016-06-23 05:45

个回答

  • 12v8
    2016-08-04 07:17:32

    这个等到后边你学习了同步机制就知道了,实现的方式需要一个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();

    }

    }


  • c5p1ng丶
    2016-06-23 10:45:46

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

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

    适合于资源的共享