Java中多线程的应用是非常多的,我们在Java中又该如何去创建线程呢?

  http://www.jianshu.com/p/40d4c7aebd66

一、常用的有三种方法来创建多线程

  • 新建一个类继承自Thread类,具体步骤如下:

    1. 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。

    2. 创建Thread子类的实例,即创建了线程对象。

    3. 调用线程对象的start()方法来启动该线程

       public class FirstThreadTest extends Thread{
      int i = 0;
      //重写run方法,run方法的方法体就是现场执行体
      public void run()
      {
      for(;i<100;i++){
      System.out.println(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)
      {
      //创建实例,并调用其start()方法启动线程
      new FirstThreadTest().start();
      new FirstThreadTest().start();
      }
      }
      }
      }
  • 新建一个类实现接口Runnable,具体步骤如下:

    1. 定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
    2. 创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

    3. 调用线程对象的start()方法来启动该线程。

       public class RunnableThreadTest implements Runnable
      {
      private int i;
      //重写run()方法
      public void run()
      {
      for(i = 0;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)
      {
      //用实现类的对象作为参数传入new Thread(Runnable obj)来创建Thread对象,然后调用start()方法启动线程
      RunnableThreadTest rtt = new RunnableThreadTest();
      new Thread(rtt,"新线程1").start();
      new Thread(rtt,"新线程2").start();
      }
      }
      }
      }
  • 通过Callable和Future创建线程,具体步骤如下:

    1. 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
    2. 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值

    3. 使用FutureTask对象作为Thread对象的target创建并启动新线程

    4. 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

       public class CallableThreadTest implements Callable<Integer>
      { public static void main(String[] args)
      {
      CallableThreadTest ctt = new CallableThreadTest();
      FutureTask<Integer> ft = new FutureTask<>(ctt);
      for(int i = 0;i < 100;i++)
      {
      System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i);
      if(i==20)
      {
      new Thread(ft,"有返回值的线程").start();
      }
      }
      try
      {
      System.out.println("子线程的返回值:"+ft.get());
      } catch (InterruptedException e)
      {
      e.printStackTrace();
      } catch (ExecutionException e)
      {
      e.printStackTrace();
      }
      } @Override
      public Integer call() throws Exception
      {
      int i = 0;
      for(;i<100;i++)
      {
      System.out.println(Thread.currentThread().getName()+" "+i);
      }
      return i;
      }
      }

二、创建线程的三种方式的对比

  采用实现Runnable、Callable接口的方式创见多线程时,优势是

    • 线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。
    • 在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。

  劣势是:

    • 编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法

  使用继承Thread类的方式创建多线程时优势是:

    • 编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。

  劣势是:

    • 线程类已经继承了Thread类,所以不能再继承其他父类

Java基础——多线程的更多相关文章

  1. Java基础-多线程-③线程同步之synchronized

    使用线程同步解决多线程安全问题 上一篇 Java基础-多线程-②多线程的安全问题 中我们说到多线程可能引发的安全问题,原因在于多个线程共享了数据,且一个线程在操作(多为写操作)数据的过程中,另一个线程 ...

  2. Java基础-多线程-②多线程安全问题

    什么是线程的安全问题? 上一篇 Java基础-多线程-①线程的创建和启动 我们说使用实现Runnable接口的方式来创建线程,可以实现多个线程共享资源: class Dog implements Ru ...

  3. java基础-多线程应用案例展示

    java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...

  4. java基础-多线程二

    java基础-多线程二 继承thread和实现Runnable的多线程每次都需要经历创建和销毁的过程,频繁的创建和销毁大大影响效率,线程池的诞生就可以很好的解决这一个问题,线程池可以充分的利用线程进行 ...

  5. 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!

    前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...

  6. java基础多线程之共享数据

    java基础巩固笔记5-多线程之共享数据 线程范围内共享数据 ThreadLocal类 多线程访问共享数据 几种方式 本文主要总结线程共享数据的相关知识,主要包括两方面:一是某个线程内如何共享数据,保 ...

  7. Java基础--多线程的方方面面

    1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 ...

  8. AJPFX: Java基础多线程(一)

    多线程是Java学习的非常重要的方面,是每个Java程序员必须掌握的基本技能.本文只是多线程细节.本质的总结,并无代码例子入门,不适合初学者理解.初学者学习多线程,建议一边看书.看博文,以便写代码尝试 ...

  9. 十三、Java基础---------多线程总结

    多线程概述 理解多线程首先应明确线程,要了解线程就必须了解什么是进程. 1.进程 是一个正在执行的程序. 每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 2.线程 就是进程 ...

随机推荐

  1. import了sun开头的类,虽然它在代码里压根就没派上用处!但是必须得引用!

    package action; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io. ...

  2. Form_Form树形结构HTree的介绍(案例)

    2013-02-09 Created By BaoXinjian

  3. 监控系统一些告警方式对比:短信、Email手机端、IM

    一.缘由: 对于运维来说,监控告警是很重要的一环,告警讲究及时性,所以这里讨论下一些常见告警方式的优劣. 二.告警方式: 1.短信SMS 短信网关通知是一种最直接.最有效的通知方式,当然成本最高. 适 ...

  4. Coding 初级教程(一)——用GitHub的GUI客户端对Coding的项目进行管理

    一.概述 二.Git基本概念 1.有关存储的四个概念 2.分支(branch) 三.项目管理实战操作 1.安装 GHfW(GitHub for Windows) 2.在Coding上新建一个项目(新建 ...

  5. windows service的继承类ServiceBase

    https://msdn.microsoft.com/zh-cn/library/system.serviceprocess.servicebase.exitcode(v=vs.80).aspx 在停 ...

  6. iPhone播放音乐

    来源:http://blog.csdn.net/htttw/article/details/7842295 iPhone播放音乐 今天我们简要介绍如何在iPhone中播放音乐: 强烈建议你参考官方文档 ...

  7. arp -s 157.55.85.212 00-aa-00-62-c6-09 .... Adds a static entry.

    ARp是一个重要的TCp/Ip协议,并且用于确定对应Ip地址的网卡物理地址.实用arp命令,我们能够查看本地计算机或另一台计算机的ARp高速缓存中的当前内容.此外,使用arp命令,也可以用人工方式输入 ...

  8. dubbo的代码项目结构

    dubbo 的项目(Project)包含下面模块(Module): 这些模块的功能描述如下: dubbo-admin  dubbo的管理平台 dubbo-demo  包含生产者.消费者.接口定义的du ...

  9. go 使用模板函数的例子

    代码: package main import (     "bytes"     "fmt"     "text/template"    ...

  10. [SQL]一组数据中Name列相同值的最大Je与最小je的差

    declare @t table(name varchar(),qy varchar(),je int) insert into @t union all union all union all un ...