Java中Runnable和Thread的区别?JAVA 继承Thread 实现多线程资源共不共享?

1. Runnable和Thread的区别?

 这两个都是可以实现多线程功能的。所以他们的区别并不是性能上 功能上的区别,而是书写方式,代码可维护性,松耦合性 以及操作方便等方便的区别了。

  1. Runnable 是接口。Thread 是类,且实现了Runnable接口。

  2. 通过继承Thread类的方式,可以完成多线程的建立。但是这种方式有一个局限性,如果一个类已经有了自己的父类,就不可以继承Thread类,因为java是单继承

  3. 所以,通常创建线程都用第二种方式。
    因为实现Runnable接口可以避免单继承的局限性。

  4. 实现Runnable接口可以避免单继承的局限性,继承Thread是可以对Thread类中的方法进行子类复写的。
    如果不需要做这个复写动作的话,只为定义线程代码存放位置,实现Runnable接口更方便一些。因为Runnable接口将线程要执行的任务封装成了对象。

2. JAVA 继承Thread 实现多线程资源共不共享?

Tread方式实现多线程,并访问变量,不好做共享

是  '不好 ' 实现 资源共享 ,而不是   不能实现资源共享 !!!

1.Thread实现多线程,不共享变量

public class Main {
 
    public static void main(String[] args) {
        MyThread T1 = new MyThread();
        MyThread T2 = new MyThread();
        T1.start();
        T2.start();
 
 
    }
 
}
 
 class MyThread extends Thread {

    private int ticket = 10;
   
    
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            if(ticket>0){
                System.out.println(Thread.currentThread().getName()+"卖票"+ticket--);
            }
            try {
                sleep(1000); //休眠1秒,避免太快导致看不到同时执行
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
    }
}

每个线程自己卖自己的票, 就是 每个线程 10个票 ,不同资源不同执行

2.Thread实现多线程,并共享变量

public class Main {
 
    public static void main(String[] args) {
        MyThread myThread= new MyThread();
        new Thread(myThread).start();
        new Thread(myThread).start();
 
 
    }
 
}
 
 class MyThread extends Thread {

    private int ticket = 10;
    
    @Override
    //记得要资源公共,要在run方法之前加上synchronized关键字,要不然会出现抢资源的情况
    public synchronized void run() {
        for (int i = 0; i < 10; i++) {
            if(ticket>0){
                System.out.println(Thread.currentThread().getName()+"卖票"+ticket--);
            }
            try {
                sleep(1000); //休眠1秒,避免太快导致看不到同时执行
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
    }
}

两个线程都执行一个任务,并且添加了synchronized关键字保证线程安全, 就是 两个线程 抢10个票 ,同资源同执行

3.Runable实现多线程,并共享变量

public class Main {
 
    public static void main(String[] args) {
 
        //测试Runnable
        MyThread myThread = new MyThread();
        new Thread(myThread).start();
        new Thread(myThread).start();
 
    }
 
}
class MyThread implements Runnable{
    private int ticket = 10;
    @Override
    //记得要资源公共,要在run方法之前加上synchronized关键字,要不然会出现抢资源的情况
    public synchronized  void  run() {
        for (int i = 0; i <10; i++) {
            if (this.ticket>0) {
                System.out.println("卖票:ticket"+this.ticket--);
            }
        }
        
    }
    
}

一般推荐使用Runable方式

3.思考 

点进去看看 Thread 的源码 ,其实就是实现了Runable 

继承Thread类 和 实现 Runnable接口本质都可以实现资源共享

public class Thread implements Runnable {
    /* Make sure registerNatives is the first thing <clinit> does. */
    private static native void registerNatives();
    static {
        registerNatives();
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值