Java中创建线程主要有三种方式:

一、继承Thread类创建线程类

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

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

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

[java] view plain copy
  1. package com.thread;
  2. public class FirstThreadTest extends Thread{
  3. int i = 0;
  4. //重写run方法,run方法的方法体就是现场执行体
  5. public void run()
  6. {
  7. for(;i<100;i++){
  8. System.out.println(getName()+"  "+i);
  9. }
  10. }
  11. public static void main(String[] args)
  12. {
  13. for(int i = 0;i< 100;i++)
  14. {
  15. System.out.println(Thread.currentThread().getName()+"  : "+i);
  16. if(i==20)
  17. {
  18. new FirstThreadTest().start();
  19. new FirstThreadTest().start();
  20. }
  21. }
  22. }
  23. }

上述代码中Thread.currentThread()方法返回当前正在执行的线程对象。GetName()方法返回调用该方法的线程的名字。

二、通过Runnable接口创建线程类

(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

(2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

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

示例代码为:

[java] view plain copy
  1. package com.thread;
  2. public class RunnableThreadTest implements Runnable
  3. {
  4. private int i;
  5. public void run()
  6. {
  7. for(i = 0;i <100;i++)
  8. {
  9. System.out.println(Thread.currentThread().getName()+" "+i);
  10. }
  11. }
  12. public static void main(String[] args)
  13. {
  14. for(int i = 0;i < 100;i++)
  15. {
  16. System.out.println(Thread.currentThread().getName()+" "+i);
  17. if(i==20)
  18. {
  19. RunnableThreadTest rtt = new RunnableThreadTest();
  20. new Thread(rtt,"新线程1").start();
  21. new Thread(rtt,"新线程2").start();
  22. }
  23. }
  24. }
  25. }

三、通过Callable和Future创建线程

(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

(2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

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

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

实例代码:

[java] view plain copy
  1. package com.thread;
  2. import java.util.concurrent.Callable;
  3. import java.util.concurrent.ExecutionException;
  4. import java.util.concurrent.FutureTask;
  5. public class CallableThreadTest implements Callable<Integer>
  6. {
  7. public static void main(String[] args)
  8. {
  9. CallableThreadTest ctt = new CallableThreadTest();
  10. FutureTask<Integer> ft = new FutureTask<>(ctt);
  11. for(int i = 0;i < 100;i++)
  12. {
  13. System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i);
  14. if(i==20)
  15. {
  16. new Thread(ft,"有返回值的线程").start();
  17. }
  18. }
  19. try
  20. {
  21. System.out.println("子线程的返回值:"+ft.get());
  22. } catch (InterruptedException e)
  23. {
  24. e.printStackTrace();
  25. } catch (ExecutionException e)
  26. {
  27. e.printStackTrace();
  28. }
  29. }
  30. @Override
  31. public Integer call() throws Exception
  32. {
  33. int i = 0;
  34. for(;i<100;i++)
  35. {
  36. System.out.println(Thread.currentThread().getName()+" "+i);
  37. }
  38. return i;
  39. }
  40. }

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

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

线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。

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

劣势是:

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

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

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

劣势是:

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

线程的一些其他api:

currentThread():获取当前执行当前线程的线程对象
isAlive():当前线程是否存活(正在执行)
sleep():使当前线程睡眠一段时间,参数单位毫秒
getId():获取当前线程的唯一标识
yield():释放当前线程的控制权,将控制权交由CPU调度。
interrupt():停止线程执行(只调用这个方法无法中止线程的执行,需要配合interrupted()才能中断线程。线程在sleep的情况下中断会抛异常并且清除停止状态的值,使之变为false)
interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志清除为false的功能。
                        此方法多次调用会有问题。比如第一次中断线程,再次调用则会清除中断状态。
isInterrupted():测试线程是否已中断。
setPriority ():设置线程的优先级,优先级越高,优先执行的几率越大。取值范围是1~10
 
jdk中不推荐使用的过期的方法以及原因:
stop():强制中断当前线程。 强制停止某个线程可能会造成某些清理操作无法完成。而且会将对象的锁给清除掉,有可能会造成数据不一致的问题。
suspend():暂停当前线程的执行,此操作并不会释放锁,有锁独占的问题。
                另外如果在System.out.println()中暂停了线程,同步锁并未释放。其他有System.out.println()的地方就无法执行。
                因为Sysem.out.println()本身底层的实现也是基于synchronized的。一个对象占着锁不放,这边就一直得不到执行。

resume():恢复当前线程的执行,此操作并不会释放锁,有锁独占的问题。

Java线程的一些api相关推荐

  1. java 线程 api_Java核心API之线程(上)

    实例代码如下: package ThreadDemo; class RunnableDemo implements Runnable { private Thread t; private Strin ...

  2. 百度java的线程技术_自我提升(基础技术篇)——java线程简介

    前言:虽然自己平时都在用多线程,也能完成基本的工作需求,但总觉得,还是对线程没有一个系统的概念,所以,查阅了一些资料,理解那些大神和官方的资料,写这么一篇关于线程的文章 本来想废话一番,讲讲自己的经历 ...

  3. 【Java】撩开Java线程的“神秘面纱”

    文章目录 一.用一句话讲明白进程和线程的关系(不甚严密) 二.浅析进程与线程 三.多线程 四.Java中的线程是什么样子的 五.java.lang.Thread & java.lang.Run ...

  4. 关于深入理解Java线程

    关于深入理解Java线程 一.线程基础 1.进程和线程 进程 线程 进程与线程的区别 进程间通信方式 2.线程的同步互斥 线程同步: 线程互斥: 四种线程同步互斥的控制方法 3.上下文切换(Conte ...

  5. 嵌入式软件开发培训笔记——java第五天(API——math/string/集合/日期时间以及java线程)

    目录 掌握命令行参数的使用 掌握Math类中常用的方法 掌握String/StringBuffer/StringBuilder的用法 掌握几种常用集合类的用法 掌握日期和时间处理 1.命令行参数 Ja ...

  6. 面试必问---Java线程池8大拒绝策略

    前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用Fix ...

  7. Java线程怎样映射到操作系统线程

    先说多线程模型,参考经典教材<Operating System Concepts , Silberschatz ,9th edition> 中文版是<操作系统概念,第9版> h ...

  8. java 线程组作用_浅析Java中线程组(ThreadGroup类)

    一.概念 Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线 ...

  9. 2017年50道Java线程面试题

    下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编 ...

最新文章

  1. python编程if语法-Python中的if语句——参考Python编程从入门到实践
  2. Centos 7 修改主机名
  3. python php multiprocessing,Python多进程并发(multiprocessing)用法实例详解
  4. 【转载】TreeView序列化,TreeView串行化,TreeView反序列化 c# winform
  5. 【java笔记】线程(3):Thread类的常用方法
  6. 【数据处理】reshape2包
  7. 【python】用PyQt5教你制作简单的水果抽奖机
  8. 去年直播android和ios打赏,iOS直播类APP上架历程
  9. MySQL分页查询的sql语句
  10. 微信公众号插入公式介绍
  11. 三菱plc控制电动推杆
  12. CREO学习笔记【钣金结构中常用的标准件】
  13. ANSYS APDL学习(4):ANSYS 基本介绍
  14. vsode 编译报错:main.c:4:10: fatal error: iostream: 没有那个文件或目录
  15. 智能聊天机器人之图灵机器人
  16. Git之深入解析如何借助Git的配置方法和钩子机制来自定义Git需求
  17. SUSE配置zypper
  18. c#移动鼠标到指定坐标并点击
  19. newman的基本使用
  20. HBC Network重塑分布式存储,抢滩区块链数据时代

热门文章

  1. 《信息安全系统设计基础》实验一 开发环境的熟悉
  2. 简单的窗体抖动托管c++
  3. mos 多路模拟电子开关_软开关设计 || 软开关硬件三极管、MOS管典型电路分析
  4. 读保护_GD32VF103之片上flash读、写、擦除
  5. linux 临时 目录权限,linux文件和目录权限的设置
  6. ldaptemplate 分页_UI设计干货分享:设计语言 - 侧边导航栏/分页
  7. formrules 表单验证限制最大值_HTML5表单
  8. android 获取sd卡视频文件名,android – 如何获取SD卡上的视频列表
  9. 灵感库 | 让设计师欲罢不能的设计网站
  10. 礼品盒子插画素材丨节日设计加上它之后价值翻倍!