Java线程的两种实现方式,以及它们之间的联系和区别

导读:本篇文章讲解 Java线程的两种实现方式,以及它们之间的联系和区别,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Java线程的两种实现方式,以及它们之间的联系和区别

本文将从继承Thread类和实现Runnable接口讲起,并阐述它们的联系和区别。

实现方式1:继承Thread类,并重写run函数

  • 代码实现
package Toy;

/**
 * 重写的run方法:使成员变量x增加200
 */
public class ToyThead extends Thread{

    int x ;
    
    @Override
    public void run(){
        for (int i = 0; i < 100; i++) {
            x += 2 ;
        }
    }
    
}
  • 主函数
package Toy;

public class Toymain {
    
    public static void main(String[] args) throws InterruptedException {
        ToyThead toyThead1 = new ToyThead();
        toyThead1.x = 10;
        
        // 启动线程 必须使用start()方法  因为 直接调用run()方法 相当于调用一个普通的方法 
        toyThead1.start();
        
        //此处我们让程序休眠了1秒钟,假如不让程序休眠的话,线程可能还处在就绪态 没有运行,x就被打印出来了。
        Thread.sleep(1000);
        
        System.out.println(toyThead1.x);

    }
}
  • 结果: 210

实现方式2:实现Runnable接口,并重写run函数

  • 代码实现
package Toy;

public class ToyRunnable implements Runnable{

    int x ;
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            x += 2;
        }
    }
}
  • 主函数
package Toy;

public class Toymain {
    
    public static void main(String[] args) throws InterruptedException {
        ToyRunnable tr = new ToyRunnable();
        tr.x = 10;
        tr.run();
        Thread.sleep(1000);
        System.out.println(tr.x);
        
    }
}
// 其他启动方法:
// PrimeRun p = new PrimeRun(143);
// new Thread(p).start();

结果:210

两种实现方式的联系和区别

  • 联系: public class Thread implements Runnable{};
  • 实现Rannabled接口的优点:避免了java的单继承的局限性
  • 区别:
    • 继承Thread类 创建线程,不能使用多个线程来共享同一个对象的资源
    • 实现 Runnable 接口创建线程,可以使用多个线程来共享同一个对象的资源
    • 代码验证:
  • 继承Thread类
package Toy;
//
public class ToyThead extends Thread{

    int x ;
	
    @Override
    public void run(){
        for (int i = 0; ; i++) {
            x += 2 ;
            try {
                sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

  • 实现 Runnable 接口
package Toy;

import static java.lang.Thread.sleep;

public class ToyRunnable implements Runnable{

    int x ;
    
    @Override
    public void run() {
        for (int i = 0; ; i++) {
            x += 2;
            try {
                sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

  • 主函数
package Toy;

public class Toymain {
    
    public static void main(String[] args) throws InterruptedException {
        ToyThead toyThead1 = new ToyThead();//Thread线程1
        toyThead1.x = 0;
        toyThead1.start();

        ToyThead toyThead2 = new ToyThead();//Thread线程2
        toyThead2.x = 0;
        toyThead2.start();

        Thread.sleep(1000);

        System.out.println(toyThead1.x);
        System.out.println(toyThead2.x);

        ToyRunnable tr = new ToyRunnable(); //实现Runnable接口的线程
        tr.x = 0;
        Thread tr1 = new Thread(tr); //线程1
        Thread tr2 = new Thread(tr);//线程2

        tr1.start();
        tr2.start();
        Thread.sleep(1000);
        System.out.println(tr.x);

    }
}

  • 运行结果:

image

由此可见,实现 Runnable 接口创建线程,两个线程都可以将成员变量x变大,所以它们共享同一个对象的资源。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/13592.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!