Java线程的一些api
Java中创建线程主要有三种方式:
一、继承Thread类创建线程类
(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
(2)创建Thread子类的实例,即创建了线程对象。
(3)调用线程对象的start()方法来启动该线程。
- package com.thread;
- 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)
- {
- new FirstThreadTest().start();
- new FirstThreadTest().start();
- }
- }
- }
- }
上述代码中Thread.currentThread()方法返回当前正在执行的线程对象。GetName()方法返回调用该方法的线程的名字。
二、通过Runnable接口创建线程类
(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
(2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
(3)调用线程对象的start()方法来启动该线程。
示例代码为:
- package com.thread;
- public class RunnableThreadTest implements Runnable
- {
- private int i;
- 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)
- {
- 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()方法来获得子线程执行结束后的返回值
实例代码:
- package com.thread;
- import java.util.concurrent.Callable;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.FutureTask;
- 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类,所以不能再继承其他父类。
线程的一些其他api:
resume():恢复当前线程的执行,此操作并不会释放锁,有锁独占的问题。
Java线程的一些api相关推荐
- java 线程 api_Java核心API之线程(上)
实例代码如下: package ThreadDemo; class RunnableDemo implements Runnable { private Thread t; private Strin ...
- 百度java的线程技术_自我提升(基础技术篇)——java线程简介
前言:虽然自己平时都在用多线程,也能完成基本的工作需求,但总觉得,还是对线程没有一个系统的概念,所以,查阅了一些资料,理解那些大神和官方的资料,写这么一篇关于线程的文章 本来想废话一番,讲讲自己的经历 ...
- 【Java】撩开Java线程的“神秘面纱”
文章目录 一.用一句话讲明白进程和线程的关系(不甚严密) 二.浅析进程与线程 三.多线程 四.Java中的线程是什么样子的 五.java.lang.Thread & java.lang.Run ...
- 关于深入理解Java线程
关于深入理解Java线程 一.线程基础 1.进程和线程 进程 线程 进程与线程的区别 进程间通信方式 2.线程的同步互斥 线程同步: 线程互斥: 四种线程同步互斥的控制方法 3.上下文切换(Conte ...
- 嵌入式软件开发培训笔记——java第五天(API——math/string/集合/日期时间以及java线程)
目录 掌握命令行参数的使用 掌握Math类中常用的方法 掌握String/StringBuffer/StringBuilder的用法 掌握几种常用集合类的用法 掌握日期和时间处理 1.命令行参数 Ja ...
- 面试必问---Java线程池8大拒绝策略
前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用Fix ...
- Java线程怎样映射到操作系统线程
先说多线程模型,参考经典教材<Operating System Concepts , Silberschatz ,9th edition> 中文版是<操作系统概念,第9版> h ...
- java 线程组作用_浅析Java中线程组(ThreadGroup类)
一.概念 Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线 ...
- 2017年50道Java线程面试题
下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编 ...
最新文章
- python编程if语法-Python中的if语句——参考Python编程从入门到实践
- Centos 7 修改主机名
- python php multiprocessing,Python多进程并发(multiprocessing)用法实例详解
- 【转载】TreeView序列化,TreeView串行化,TreeView反序列化 c# winform
- 【java笔记】线程(3):Thread类的常用方法
- 【数据处理】reshape2包
- 【python】用PyQt5教你制作简单的水果抽奖机
- 去年直播android和ios打赏,iOS直播类APP上架历程
- MySQL分页查询的sql语句
- 微信公众号插入公式介绍
- 三菱plc控制电动推杆
- CREO学习笔记【钣金结构中常用的标准件】
- ANSYS APDL学习(4):ANSYS 基本介绍
- vsode 编译报错:main.c:4:10: fatal error: iostream: 没有那个文件或目录
- 智能聊天机器人之图灵机器人
- Git之深入解析如何借助Git的配置方法和钩子机制来自定义Git需求
- SUSE配置zypper
- c#移动鼠标到指定坐标并点击
- newman的基本使用
- HBC Network重塑分布式存储,抢滩区块链数据时代
热门文章
- 《信息安全系统设计基础》实验一 开发环境的熟悉
- 简单的窗体抖动托管c++
- mos 多路模拟电子开关_软开关设计 || 软开关硬件三极管、MOS管典型电路分析
- 读保护_GD32VF103之片上flash读、写、擦除
- linux 临时 目录权限,linux文件和目录权限的设置
- ldaptemplate 分页_UI设计干货分享:设计语言 - 侧边导航栏/分页
- formrules 表单验证限制最大值_HTML5表单
- android 获取sd卡视频文件名,android – 如何获取SD卡上的视频列表
- 灵感库 | 让设计师欲罢不能的设计网站
- 礼品盒子插画素材丨节日设计加上它之后价值翻倍!