• Java值创建线程的两种方式对比


    在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口。那么这两种方式孰优孰劣呢?

    采用继承Thead类实现多线程:

    优势:编写简单,如果需要访问当前线程,只需使用this即可,无需使用Thead.currentThread()方法。

    劣势:因为这种线程类已经继承了Thead类,所以不能再继承其它类。

    示例代码:

       1: package org.frzh.thread;
       2:  
       3: public class FirstThread extends Thread{
       4:     private int i;
       5:     
       6:     //重写run方法,run方法的方法体就是线程执行体
       7:     public void run() {
       8:         for (; i < 100; i++) {
       9:             //当线程类继承Thread类时,可以直接调用getName方法获得当前线程名
      10:             //如果想获得当前线程,直接使用this
      11:             //Thread对象的getName方法返回当前线程的名字
      12:             System.out.println(getName() + " " + i);
      13:         }
      14:     }
      15:     
      16:     public static void main(String[] args) {
      17:         for (int i = 0; i < 100; i++) {
      18:             //调用Thead的currentThread方法获取当前线程
      19:             System.out.println(Thread.currentThread().getName() + " " +i);
      20:             if (i == 20) {
      21:                 new FirstThread().start();
      22:                 new FirstThread().start();
      23:             }
      24:         }
      25:     }
      26: }

    运行结果片段:

    捕获

    我们发现,在两个子线程中i的值并不连续,似乎与我们说的子线程直接共享数据不符。其实,在这里我们实例化了两个子线程,每个拥有自己的实例变量i。

    采用实现Runable接口的多线程:

    优势:线程类只是实现了Runable接口,因此还可以继承其他类;

             在这种情况下,可以使多个线程共享一个target对象,所以非常适合多个线程用来处理同一份资源的情况,从而可以将cpu、代码和数据分开,形成清晰的模型,较好的体现面向对象思想。

    劣势:编程略有些复杂,如果要访问当前线程必须使用Thread.currentThread方法。

    示例代码:

       1: package org.frzh.thread;
       2:  
       3: public class SecondThread implements Runnable{
       4:     private int i;
       5:     
       6:     @Override
       7:     public void run() {
       8:         // TODO Auto-generated method stub
       9:         for (; i < 100; i++) {
      10:             System.out.println(Thread.currentThread().getName() + " " + i);
      11:         }
      12:     }
      13:     
      14:     public static void main(String[] args) {
      15:         for (int i = 0; i < 100; i++) {
      16:             System.out.println(Thread.currentThread().getName() + " " + i);
      17:             if (i == 20) {
      18:                 SecondThread st = new SecondThread();
      19:                 new Thread(st, "子线程1").start();
      20:                 new Thread(st, "子线程2").start();
      21:             }
      22:         }
      23:     }
      24:  
      25: }

    运行结果片段:

    捕获

    可以看到,此时的i值是连续变化的,因为线程1和2共享同一个target。

  • 相关阅读:
    递归
    高等数学思维导图——1.函数与极限
    sort方法和自定义比较器的写法
    PriorityQueue(优先队列)
    常用JAVA API :HashSet 和 TreeSet
    常用Java API:HashMap 和 TreeMap
    ArrayList、Vector和LinkedList的区别
    构造方法
    面向对象特点:封装、继承、多态
    匿名对象
  • 原文地址:https://www.cnblogs.com/hgfrzh/p/3367615.html
Copyright © 2020-2023  润新知