源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-02-21 12:45 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java创建多线程的两种方式对比
[b]采用继承Thead类实现多线程:[/b] 优势:编写简单,如果需要访问当前线程,只需使用this即可,无需使用Thead.currentThread()方法。 劣势:因为这种线程类已经继承了Thead类,所以不能再继承其它类。 示例代码:
[u]复制代码[/u] 代码如下:
 package org.frzh.thread;    public class FirstThread extends Thread{      private int i;           //重写run方法,run方法的方法体就是线程执行体      public void run() {          for (; i < 100; i++) {              //当线程类继承Thread类时,可以直接调用getName方法获得当前线程名              //如果想获得当前线程,直接使用this              //Thread对象的getName方法返回当前线程的名字              System.out.println(getName() + " " + i);          }      }           public static void main(String[] args) {          for (int i = 0; i < 100; i++) {              //调用Thead的currentThread方法获取当前线程              System.out.println(Thread.currentThread().getName() + " " +i);              if (i == 20) {                  new FirstThread().start();                  new FirstThread().start();              }          }      }  }
运行结果片段: [img]http://files.jb51.net/file_images/article/201410/201410310948111.png[/img] 我们发现,在两个子线程中i的值并不连续,似乎与我们说的子线程直接共享数据不符。其实,在这里我们实例化了两个子线程,每个拥有自己的实例变量i。 [b]采用实现Runable接口的多线程:[/b] 优势:线程类只是实现了Runable接口,因此还可以继承其他类;          在这种情况下,可以使多个线程共享一个target对象,所以非常适合多个线程用来处理同一份资源的情况,从而可以将cpu、代码和数据分开,形成清晰的模型,较好的体现面向对象思想。 劣势:编程略有些复杂,如果要访问当前线程必须使用Thread.currentThread方法。 示例代码:
[u]复制代码[/u] 代码如下:
 package org.frzh.thread;    public class SecondThread implements Runnable{      private int i;           @Override      public void run() {          // TODO Auto-generated method stub          for (; i < 100; i++) {              System.out.println(Thread.currentThread().getName() + " " + i);          }      }           public static void main(String[] args) {          for (int i = 0; i < 100; i++) {              System.out.println(Thread.currentThread().getName() + " " + i);              if (i == 20) {                  SecondThread st = new SecondThread();                  new Thread(st, "子线程1").start();                  new Thread(st, "子线程2").start();              }          }      }    }
运行结果片段: [img]http://files.jb51.net/file_images/article/201410/201410310948112.png[/img] 可以看到,此时的i值是连续变化的,因为线程1和2共享同一个target。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部