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. linux下mongodb定时备份指定的集合

    目标:把一台linux机上mongodb的数据定时备份到另一台机上: 过程: 一开始打算使用mongoexport和mongoimport,但是总是会报“\x00”字符串不能识别的问题,后来就改成了m ...

  2. visual studio 声明数组太大,导致栈溢出

    在解释原因前我们先看一下一个由C/C++编译的程序占用的内存分为几个部分: 1.栈区(stack segment):由编译器自动分配释放,存放函数的参数的值,局部变量的值等.在Windows下,栈是向 ...

  3. 三. ServerSocket用法

    一.构造ServerSocket 构造方法 (1)new ServerSocket( ) (2)new ServerSocket(int port,int backlog) (3)new Server ...

  4. android listView Exception

    - ::-/com.tongyan.tutelage W/System.err﹕ java.text.ParseException: Unparseable date: ) - ::-/com.ton ...

  5. NSString类的相关用法

    一.NSString字符串连接NSString* string; // 结果字符串 NSString* string1, string2; //已存在的字符串 1. string = [NSStrin ...

  6. angular.js 的angular.copy 、 angular.extend 、 angular.merge

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. MySQL运算符之 <=>

    问题 : 我在看以前的一个开发者的代码时看到 WHERE p.name <=> NULL 在这个查询语句中 <=>符号是什么意思啊?是不是和 =号是一样啊?还是一个语法错误啊? ...

  8. Spring Bean 生命周期2

    在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...

  9. MySQL作业

    创建作业事件 MONTH STARTS '2015-01-01 05:30:01' ON COMPLETION NOT PRESERVE ENABLE DO CALL sp_moveLoginReco ...

  10. JSON.stringify()的使用--将string转换成json

    ===========================================================1. ====JSON.stringify()================== ...