zoukankan      html  css  js  c++  java
  • java多线程:继承Thread和实现Runable接口的区别

    java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点:

    首先,java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了。

    其次,如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

    1.继承Thread——多线程执行各自的资源,线程执行的资源互不干涉,各自执行各自的

    public class testThread extends Thread{
        private int count=5;
        private String name;
        public testThread(String name) {
           this.name=name;
        }
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(name + "运行  count= " + count--);
                try {
                    sleep((int) Math.random() * 10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
           
        }
    }
    public class main1 {
        public static void main(String[] args) {
            testThread mTh1=new testThread("A");
            testThread mTh2=new testThread("B");
            mTh1.start();
            mTh2.start();
        }
    }

    控制台输出(线程1和线程2之间的变量是不能共享的,每次count--都有各自的变量和结果。):

    2.实现Runnable接口——多线程共享同一资源:

    public class testRunnable implements Runnable{
        private int count=15;
        @Override
        public void run() {
              for (int i = 0; i < 5; i++) {
                  System.out.println(Thread.currentThread().getName() + "运行  count= " + count--);
                    try {
                        Thread.sleep((int) Math.random() * 10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
        }
        
    }
    public class main2 {
        public static void main(String[] args) {
            testRunnable mTh = new testRunnable();
                new Thread(mTh, "C").start();//同一个mTh,但是在Thread中就不可以,如果用同一个实例化对象mt,就会出现异常   
                new Thread(mTh, "D").start();
                new Thread(mTh, "E").start();
        }
     
    }

    控制台输出(三个不同的线程之间的变量是共享的,每次count--得到的记过都是再上一个线程运行结果之上得到的。):

    转自:https://blog.csdn.net/u010926964/article/details/74962673

  • 相关阅读:
    AngularJS ——ngResource、RESTful APIs 使用
    Angularjs promise-$q服务详解
    ui-router参数传递
    overflow知多少
    css3 @font-face设置嵌入字体
    CSS3文本超出容器显示省略号之text-overflow属性
    CSS3线性渐变和径向渐变
    CSS3边框图片属性---border-image
    在移动端如何选择字体大小和布局的单位,px或dp?
    angular $http配置属性
  • 原文地址:https://www.cnblogs.com/vickylinj/p/10923491.html
Copyright © 2011-2022 走看看