Java多线程的两种实现方式

Java总共有两种方式实现多线程

方式1:通过继承Thread类的方式

 

复制代码
package com.day04;

/**
 * 通过继承Thread类并复写run方法来是实现多线程
 * 
 * @author Administrator
 *
 */
public class ThreadDemo1 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 4; i++) {
            // 获取当前线程的名字
            // String threadName = Thread.currentThread().getName(); //方式1
            String threadName = super.currentThread().getName(); // 方式2
            System.out.println(threadName + " print " + i);
        }
    }

    public static void main(String[] args) {
        // 创建线程对象
        ThreadDemo1 t1 = new ThreadDemo1();
        ThreadDemo1 t2 = new ThreadDemo1();
        // 调用start方法启动多线程
        t1.start();
        t2.start();
    }

}
复制代码

运行结果如下:

Thread-1 print 0
Thread-0 print 0
Thread-1 print 1
Thread-0 print 1
Thread-0 print 2
Thread-0 print 3
Thread-1 print 2
Thread-1 print 3

可以发现总共开启了两个线程,并且两个线程是随机打印出对应的序号,这是因为这两个线程在抢占系统资源是随机的,谁抢到,谁就执行打印语句。

方式1:通过实现Runnable接口来实现

 

复制代码
package com.day04;

/**
 * 通过实现Runnable接口来实现多线程
 * 
 * @author Administrator
 *
 */
public class ThreadDemo2 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 4; i++) {
            // 获取当前线程的名字
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + " print " + i);
        }
    }

    public static void main(String[] args) {
        // 创建线程对象
        ThreadDemo2 t1 = new ThreadDemo2();
        // 调用start方法启动多线程
        new Thread(t1).start();
        new Thread(t1).start();
    }

}
复制代码

运行结果如下:

Thread-0 print 0
Thread-0 print 1
Thread-1 print 0
Thread-0 print 2
Thread-1 print 1
Thread-1 print 2
Thread-1 print 3
Thread-0 print 3

可以发现总共开启了两个线程,并且两个线程是随机打印出对应的序号,这是因为这两个线程在抢占系统资源是随机的,谁抢到,谁就执行打印语句。

总结:

1.继承Thread类并复写run方法的方式:

优点:实现简单。

缺点:因为java是单继承,所以当某个类继承了Thread类,就不能在继承其他的类了。

2.通过实现Runnable接口的方式

缺点:实现稍微复杂点。

优点:因为是通过实现接口的方式,所以它可以再继承其他的类,不存在局限性。

注意的是:继承Thread如果要获取当前线程的名字可以通过Thread.currentThread().getName()之外,还可以通过super.currentThread().getName()这种方式来获取,而实现接口的方式只能通过Thread.currentThread().getName()这种方式来获取。

 

posted @   南阳客  阅读(955)  评论(0编辑  收藏  举报
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示