java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JAVA多线程进阶方式

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

作者:德钦

这篇文章主要介绍了JAVA多线程进阶方式(Runnable接口的讲解和运用),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

JAVA多线程

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

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

具体语法是:

public class Thread extends Object implements Runnable

使用Runnable 接口

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

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

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

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

您可能感兴趣的文章:
阅读全文