在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。

Java值创建线程的两种方式对比的更多相关文章

  1. Java中创建线程的两种方式

    创建线程的第一种方式: 创建一个类继承Thread 重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置.) 创建子类对象,其实就是在创建 ...

  2. Java多线程——创建线程的两种方式

    创建线程方式一:继承Thread类. 步骤:1,定义一个类继承Thread类.2,覆盖Thread类中的run方法.3,直接创建Thread的子类对象创建线程.4,调用start方法开启线程并调用线程 ...

  3. 【Java】创建线程对象两种方式

    1.继承Thread类,重载run方法: Thread t = new Thread(new Runnable() { @Override public void run() { // TODO Au ...

  4. 【java并发】传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  5. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  6. 创建线程的两种方式比较Thread VS Runnable

    1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 public class MyThread extends Thread{ @Override public vo ...

  7. java创建线程的两种方式及源码解析

    创建线程的方式有很多种,下面我们就最基本的两种方式进行说明.主要先介绍使用方式,再从源码角度进行解析. 继承Thread类的方式 实现Runnable接口的方式 这两种方式是最基本的创建线程的方式,其 ...

  8. Java 多线程 创建线程的4种方式

    1 继承Thread类,重写run方法.Thread类实现了Runnable接口. 2 实现Runnable接口,重写run方法.相比于继承Thread类,可以避免单继承的缺陷和实现资源共享. 举例: ...

  9. Java中创建线程的三种方式以及区别

    在java中如果要创建线程的话,一般有3种方法: 继承Thread类: 实现Runnable接口: 使用Callable和Future创建线程. 1. 继承Thread类 继承Thread类的话,必须 ...

随机推荐

  1. node.js 入门(一)安装

    从 https://nodejs.org/ 下载最新版的node.js 下载完成后,双击安装, 一路点击"Next"按钮即可. 等出现上图及表示安装成功. 按"win+r ...

  2. mysql中select into 和sql中的select into 对比

    现在有张表为student,我想将这个表里面的数据复制到一个为dust的新表中去.answer 01: create table dust select * from student;//用于复制前未 ...

  3. Linux操作系统报:read-only file system

    在对集群测试过程中发现系统中某一节点中的磁盘变成read-only file system,从而导致测试任务出错,从网上查找资料,找到以下解决方案: 这个报错的意思是硬盘属性变成只读,不可写入: VO ...

  4. LinearLayout遇到的问题——利用LinearLayout做横向滑动冲突

    问题:当我添加两个TextView的时候,然后滑动,发现只生成了一个TextView. 就是 <?xml version="1.0" encoding="utf-8 ...

  5. Laravel Packages 开发

    Packages是向Laravel中添加功能最重要的途径.composer.json中require的都是包.关于包的详细说明请查看 API . 下面一起创建一个简单的Package : 1. 环境配 ...

  6. xml文件的解析

    1. xml文件的解析 void CDataMgr::readStringData() { std::string xml_name = "config/string.xml"; ...

  7. fzu 1753 Another Easy Problem

    本题题意为求 t (t<150) 个 c (n,m)  (1<=m<=n<=100000)的最大公因子: 本题的难点为优化.主要有两个优化重点.一是每次对单个素因子进行处理,优 ...

  8. Azure File SMB3.0文件共享服务(1)

    Azure Storage File是Azure推出的文件共享服务,目前的版本同时支持SMB 2.1和SMB 3.0协议.文件共享服务非常适合那些希望把自己数据中心中使用文件共享的应用程序,在云端需要 ...

  9. MSBI常见问题总结

    SSIS 1.对连接管理器“DC”的AcquireConnection方法调用失败,错误代码0xC0209303.可能在此之前已经发出错误消息,提供了有关AcquireConnection方法调用失败 ...

  10. let区别(关于racket和r5rs)

    R5RS is the Revised5 Report on the Algorithmic Language Scheme.参考http://www.schemers.org/Documents/S ...