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方法。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。