JAVA多线程进阶方式(Runnable接口的讲解和运用)

 更新时间:2024年01月16日 10:36:19   作者:德钦  
这篇文章主要介绍了JAVA多线程进阶方式(Runnable接口的讲解和运用),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

JAVA多线程

到目前为止,线程都是通过扩展Thread类来创建的,如果程序员需要继承其他类(非Thread类),而且还要使用当前类实现多线程,那么可以通过Runnable接口来进行实现。

感谢借鉴,给予了我很大的学习。这里写链接内容

具体语法是:

public class Thread extends Object implements Runnable

使用Runnable 接口

启动新的线程的步骤如下:

  • 1.建立Runnable 对象
  • 2.使用参数为Runnable 对象的构造方法进行创建Thread 实例
  • 3.调用start()方法启动线程

Runnable

接口应该是有哪些打算通过某一个线程执行其中实例的类进行实现,类必须定义一个称为run的无参方法。

Thread (Runnable target)

创建线程第二种方式

实现Runnable 接口

1.定义类实现Runnable 接口

2. 覆盖Runnable 接口中的run方法(将线程要运行的代码存放在该run方法中)

3. 通过Thread 类建立线程对象

4.将Runnale接口的子类对象作为实际的参数传递给Thread 类的构造函数(为什么要Runnable 接口的自欸对象传递给Thread的子类对象,所以要让线程去指定对象的run方法,就必须明确该run方法所属的对象)

5.调用Thread 类的start方法开启线程并且调用Runnable 接口的子类的run 方法。

  • 此应用程序公共类有一个double型类属性(变量)x,初始值为0;
  • 在应用程序主进程中新开两个线程,这两个线程都进行死循环;
  • 第1个线程每隔300ms激活一次,令类属性x自加1.0并输出显示;
  • 第2个线程每隔400ms激活一次,令类属性x自加0.1并输出显示。
public class tiaozhan4 {
    static double x=0; //定义一个浮点型变量并赋值
    public static void main(String[] args){
        Thread a=new Thread(new ACThread());//创建一个新的线程
        Thread b=new Thread(new BCThread());//创建一个新的线程
        System.out.println("初值:"+x);//显示x初值是0
        a.start();
        b.start();
    }
 public static class ACThread implements Runnable{
    public void run(){
        try{
        while(true){
            Thread.sleep(300);
            x+=1;
            System.out.println("线程1="+x);
            }
        }
            catch(InterruptedException e){
            }
        }
    }
public static class BCThread implements Runnable{
    public void run(){
        try{
        while(true){
                Thread.sleep(400);
                x+=0.1;
                System.out.println("线程2="+x);
            }
        }
            catch(InterruptedException e){
            }
        }
    }
}

结果

讲解

public class tiaozhan4 {
    static double x=0; //定义一个浮点型变量并赋值
    public static void main(String[] args){
        Thread a=new Thread(new ACThread());//创建一个新的线程
        Thread b=new Thread(new BCThread());//创建一个新的线程
        System.out.println("初值:"+x);//初值为0
        a.start();
        b.start();
    }

这里我们可以看到,}只有一个 说明,下面的我们写的Runnable 接口类是包含在public class 里里面的,故在下面的函数名书写中,我尝试了写出class 文件名的方式,但是系统发送报错,我改为public static void 文件名是才可以运行。

这一点我们需要注意,这是和Thread 类的不一样的一点。

由于我们要在主函数的基础上,新开两个线程,所以我们在这里创建了两个线程,并且start 开始运行run 部分两次。

public static class ACThread implements Runnable{
    public void run(){
        try{
        while(true){
            Thread.sleep(300);
            x+=1;
            System.out.println("线程1="+x);
            }
        }
            catch(InterruptedException e){
            }
        }
    }
public static class BCThread implements Runnable{
    public void run(){
        try{
        while(true){
                Thread.sleep(400);
                x+=0.1;
                System.out.println("线程2="+x);
            }
        }
            catch(InterruptedException e){
            }
        }
    }
}

这里就是按着文章的要求写出该方法即可。

值得注意的是,用到啊了时间间隔Thread.sleep 时,需要进行JAVA异常捕捉机制的书写。

我们在输出的时候去注明线程1和线程2,这样子在输出的时候可以便于观察JAVA 虚拟机是如何将这两个线程进行分配运行的。

注意

其实,我们多运行几次就可以发现,其实每次的结果可能会不太一样。

因为虚拟机的运行,可能先开始执行了线程1,当线程1已经10或者12的时候,这时候才开始执行线程2,所以这就是刚开的时候全是整数,后面逐渐多出来小数的原因。

总结

实现的方式和继承的方法有什么区别?

实现的方式好处是避免了单继承的局限性。

在定义线程的时候,建立使用实现的方式。

两种方式的区别:继承Thread :线程代码存放Thread 子类 run方法中。

线程代码存在接口的子类的run方法。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • maven多个仓库查询的优先级顺序案例讲解

    maven多个仓库查询的优先级顺序案例讲解

    这篇文章主要介绍了maven多个仓库查询的优先级顺序,考虑到我们常用的配置文件是conf/settings.xml和工程里面的pom.xml文件,我们针对这两个文件的结合来分析仓库的使用顺序,需要的朋友可以参考下
    2023-04-04
  • Java多线程之定时器Timer的实现

    Java多线程之定时器Timer的实现

    这篇文章主要为大家详细介绍了Java多线程中定时器Timer类的使用以及模拟实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • java多线程实现文件下载

    java多线程实现文件下载

    这篇文章主要为大家详细介绍了java多线程实现文件下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • java 中冒泡、二分、快速算法详解

    java 中冒泡、二分、快速算法详解

    这篇文章主要介绍了java 中冒泡、二分、快速算法详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • Java超详细分析讲解哈希表

    Java超详细分析讲解哈希表

    哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方,说起来可能感觉有点复杂,我想我举个例子你就会明白了,最典型的的例子就是字典
    2022-06-06
  • java正则替换img标签中src值的方法

    java正则替换img标签中src值的方法

    今天小编就为大家分享一篇java正则替换img标签中src值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Java中的static静态代码块的使用详解

    Java中的static静态代码块的使用详解

    本篇文章介绍了,Java中的static静态代码块的使用详解。需要的朋友参考下
    2013-04-04
  • SpringBoot整合数据库访问层的实战

    SpringBoot整合数据库访问层的实战

    本文主要介绍了SpringBoot整合数据库访问层的实战,主要包含JdbcTemplate和mybatis框架的整合应用,具有一定的参考价值,感兴趣的可以了解一下
    2022-03-03
  • java实现一个简单TCPSocket聊天室功能分享

    java实现一个简单TCPSocket聊天室功能分享

    这篇文章主要为大家分享了java实现的一个简单TCPSocket聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • java如何接收和发送ASCII数据

    java如何接收和发送ASCII数据

    这篇文章主要介绍了java如何接收和发送ASCII数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论