在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. Shell学习之Shift的用法

        位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1 ...

  2. apache配置gzip模式(转)

    最近在看有关提高website性能的书,个人觉得挺不错的两本书: <<high performance websites>> <<even faster websi ...

  3. python核心编程-第四章-个人笔记

    1.所有的python对象都拥有三个特性: ①身份:每个对象都有唯一的身份标识自己,可用内建函数id()来得到.基本不会用到,不用太关心 >>> a = 2 >>> ...

  4. 使用notepad++学习python爬虫,print网页中文乱码问题

    今天学习使用python爬虫的时候发现爬到的网页中文会乱码,一直网上搜索解决办法,一个一个试验过去,发现还是乱码,然后我就开始使用其它方法测试,用python自带的编辑器打开是正常的,发现是notep ...

  5. SQL Server 控制锁升级

    背景知识: 锁升级的路线图.行--> 页 --> 区(extent)-->区(表分区)--> 表: alter table 控制锁的升级行为: 1.table SQL Serv ...

  6. 混合使用Azure LB和ILB访问相同web服务(3)

    接下来我们来配置Azure Load balancer,就是面向公网的负载均衡器: 1.在该测试中,为了保持内网访问和外网访问一样的体验,本地端口和public端口和ILB一样,同样是80: PS C ...

  7. Oracle EBS-SQL (CST-4):检查组织间项目成本.sql

    select       i1.segment1                                                                           项 ...

  8. Learn LIBSVM---a practical Guide to SVM classification

    想学习一下SVM,所以找到了LIBSVM--A Library for Support Vector Machines,首先阅读了一下网站提供的A practical guide to SVM cla ...

  9. Inno Setup:获取isl中的多国语言字串

    原文 http://zwkufo.blog.163.com/blog/static/25882512010101041626803/?suggestedreading&wumii 用InnoS ...

  10. mfc窗口,父窗口parentwindow,所有者窗口ownerwindow 区别

    一. parent:创建者,owner:所有者 小玉的父母生下小玉,养到8岁,卖给贾府当丫头小玉的父母是parent,贾府是owner 二. 1.Pop-up窗口: 一个弹出窗口是必须具有WS_POP ...