Java多线程 - Thread和Runnable的区别

18 篇文章 0 订阅
9 篇文章 0 订阅

在这我们就不在讲解Thread和Runnable的用法,如果不会的可以去看上一篇文章:《Java实现多线程的几种方式》

Runnable是接口。

Thread是一个类,继承了Runnable。

我们来看一下Thread的源码:

在Runnable接口中并没有Start方法,只有Thread类有。

Thread类,有一个构造函数:public Thread (Runnable targer)

此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。

使用情况

在程序开发中只要是多线程肯定永远以实现Runnable接口为主。

实现Runnable接口相比继承Thread类有如下好处:
1、避免继承的局限,一个类可以继承多个接口。

2、适合于资源的共享。

实例

已买票为例,总共有10张动车票,全国3个窗口在卖。

继承Thread类

    package multithreading;  
      
    public class MyThreadWithExtends extends Thread {  .
        private int tickets = 10;  
        @Override  
        public void run() {  
            for (int i = 0; i <= 100; i++) {  
                if(tickets>0){  
                    System.out.println(Thread.currentThread().getName()+"--卖出票:" + tickets--);  
                }  
            }  
        }  

        public static void main(String[] args) {  
            MyThreadWithExtends thread1 = new MyThreadWithExtends();  
            MyThreadWithExtends thread2 = new MyThreadWithExtends();  
            MyThreadWithExtends thread3 = new MyThreadWithExtends();  
            thread1.start();  
            thread2.start();  
            thread3.start();  
            //每个线程都独立,不共享资源,每个线程都卖出了10张票,总共卖出了30张。如果真卖票,就有问题了。  
        }  
    }  

运行结果:

Thread-0--卖出票:10
Thread-2--卖出票:10
Thread-1--卖出票:10
Thread-2--卖出票:9
Thread-0--卖出票:9
Thread-2--卖出票:8
Thread-1--卖出票:9
Thread-2--卖出票:7
Thread-0--卖出票:8
Thread-2--卖出票:6
Thread-2--卖出票:5
Thread-2--卖出票:4
Thread-1--卖出票:8
Thread-2--卖出票:3
Thread-0--卖出票:7
Thread-2--卖出票:2
Thread-2--卖出票:1
Thread-1--卖出票:7
Thread-0--卖出票:6
Thread-1--卖出票:6
Thread-0--卖出票:5
Thread-0--卖出票:4
Thread-1--卖出票:5
Thread-0--卖出票:3
Thread-1--卖出票:4
Thread-1--卖出票:3
Thread-1--卖出票:2
Thread-0--卖出票:2
Thread-1--卖出票:1

Thread-0--卖出票:1

每个线程都独立,不共享资源,每个线程都卖出了10张票,总共卖出了30张。如果真卖票,就有问题了。

实现Runnable接口方式

    package multithreading;  

    public class MyThreadWithImplements implements Runnable {  
        private int tickets = 10;  
        @Override  
        public void run() {  
            for (int i = 0; i <= 100; i++) {  
                if(tickets>0){  
                    System.out.println(Thread.currentThread().getName()+"--卖出票:" + tickets--);  
                }  
            }  
        }  
          
        public static void main(String[] args) {  
            MyThreadWithImplements myRunnable = new MyThreadWithImplements();  
            Thread thread1 = new Thread(myRunnable, "窗口一");  
            Thread thread2 = new Thread(myRunnable, "窗口二");  
            Thread thread3 = new Thread(myRunnable, "窗口三");  
            thread1.start();  
            thread2.start();  
            thread3.start();  
        }  
    } 

运行结果:

窗口二--卖出票:10
窗口三--卖出票:9
窗口一--卖出票:8
窗口三--卖出票:6
窗口三--卖出票:4
窗口三--卖出票:3
窗口三--卖出票:2
窗口三--卖出票:1
窗口二--卖出票:7

窗口一--卖出票:5

转载:https://blog.csdn.net/zengmingen/article/details/53217229

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值