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方法。

这里写图片描述

本人‘低人一等’,才疏学浅,我可能被许多人瞧不起,我知道我不配。
嘴炮谁不会,你看好了,我是怎么做的。

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值