多线程实现方式——Java多线程(1)

青旅半醒 2023-02-14 01:48 114阅读 0赞
1. 1继承Thread并重写run方法:
  1. public class ThreadDemo1 extends Thread {
  2. public ThreadDemo1(){
  3. }
  4. public ThreadDemo1(String name){
  5. super(name);
  6. }
  7. public void run(){
  8. for(int i = 0;i<10;i++){
  9. System.out.println("当前线程名称:"+ Thread.currentThread().toString()+"-"+i);
  10. }
  11. }
  12. }
  13. public class Client {
  14. public static void main(String[] args) {
  15. ThreadDemo1 thread = new ThreadDemo1("子线程");
  16. //开启子线程
  17. thread.start();
  18. for (int i = 0;i<10;i++){
  19. System.out.println("当前的线程名称是:"+Thread.currentThread().toString()+"-"+i);
  20. }
  21. }
  22. }

在执行到thread.start()方法时,jvm开启一个子线程,主线程在main方法执行时被创建,这样一个最简单的多线程就实现了。
在这里插入图片描述

当线程的任务执行结束之后,java虚拟机栈内存自动释放

1.2 使用Runnable接口

步骤:

  • 定义Runable接口的实现类,并实现run实现类,
  • 创建该实现类的实例
  • 调用start()方法

    public class RunnableImpl implements Runnable {

    1. @Override
    2. public void run() {
    3. try {
    4. System.out.println("子线程:"+ Thread.currentThread().toString()+"休眠1秒钟");
    5. Thread.sleep(1000);
    6. } catch (InterruptedException e) {
    7. e.printStackTrace();
    8. }
    9. }

    }

    public class Client1 {

    1. public static void main(String[] args) {
    2. RunnableImpl runnable = new RunnableImpl();
    3. //创建线程对象
    4. Thread thread = new Thread(runnable);
    5. thread.start();
    6. for (int i = 0;i<10;i++){
    7. System.out.println("当前的线程名称是:"+Thread.currentThread().toString()+"-"+i);
    8. }
    9. }
    10. }

通过实现Runnable接口,使得该类有了多线程类的特征。不管是继承Thread类还是实现 Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的

1.3 使用匿名内部类实现多线程
  1. /** * 使用匿名内部类的方式实现多线程 */
  2. public class AnonymThread {
  3. public static void main(String[] args) {
  4. new Thread(new Runnable() {
  5. @Override
  6. public void run() {
  7. System.out.println("子线程"+Thread.currentThread().toString()+"执行了");
  8. }
  9. }).start();
  10. System.out.println("主线程"+Thread.currentThread().toString()+"执行了");
  11. }
  12. }

那在内存中又是如何执行的呢?如果不了解jvm内存模型请移步添加链接描述
每个线程都会有一个私有的虚拟机栈,进行方法的压栈和出栈
在这里插入图片描述

1.4 使用Thread和是用Runnable实现多线程的区别

根本原因:Java是不支持多继承的,但是支持实现多个接口,如果继承Thread则不利于资源的共享
因此Runnable接口相较于Thread优势更大:

  • 适合多个相同的程序代码的线程去共享同一个资源。
  • 可以避免java中的单继承的局限性。
  • 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
  • 线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。

发表评论

表情:
评论列表 (有 0 条评论,114人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线——java实现线方式

    1、线程和进程 要理解多线程,我们必须首先弄清楚线程和进程的概念。在上一篇博文总已经较为详细的介绍过,本篇博文只做总结。 进程就是运行的程序,每个进程都有独立的代码和数据