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. event 关键字

    event(C# 参考) event 关键字用于在发行者类中声明事件.下面的示例演示如何声明和引发将 EventHandler 用作基础委托类型的事件. C# public class SampleE ...

  2. Eclipse中Maven+Spring3.2.8+SpringMVC HelloWorld项目

    本文适合有一定spring和springmvc基础,并想使用Maven管理项目的人. 源码打包:http://pan.baidu.com/s/1hqurUcs 转载请声明出处(http://www.c ...

  3. .net EntityFramework用法探索系列 1

    EntityFramework用法探索系列 (一)DatabaseFirst (二)CodeFirst (三)CodeFirst流畅API (四)Repository和UnitOfWork (五)引入 ...

  4. 第一个Flask Web

    https://github.com/ethan-funny/head-first-flask iOS多线程技术方案 http://www.cnblogs.com/Erma-king/p/593427 ...

  5. CLR如何调用虚方法、属性和事件

    方法代表在类型或类型的实例上执行某些操作的代码.在类型上执行操作,称为静态方法:在类型的实例上执行操作,称为非静态方法.任何方法都有一个名称.一个签名和一个返回值(可以是void). CLR允许一个类 ...

  6. AD按键-矩阵按键:

    原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...

  7. maven PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path

    maven编译的时候遇到的奇葩问题,  非常奇葩, 所有其他同事都没有遇到 , 仅仅是我遇到了 不清楚是因为用了最新的JDK的缘故(1.8 update91)还是其他什么原因. 总之是证书的问题. 当 ...

  8. JQuery之DataTables强大的表格解决方案

    1.DataTables的默认配置 $(document).ready(function() { $('#example').dataTable(); } ); 示例:http://www.guoxk ...

  9. java多线程之计算数量

    package Thread.Abort; import java.util.ArrayList; import java.util.List; import java.util.Random; im ...

  10. js中如何操作json数据

    一.要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组. 1.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...