Java:多线程,分别用Thread、Runnable、Callable实现线程
并发性(concurrency)和并行性(parallel)是两个概念,并行是指在同一时刻,有多条指令在多个处理器上同时执行;并发指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得宏观上具有多个进程同时执行的效果。
多线程编程优点:
- 进程之间不能共享内存,但线程之间共享内存非常容易。
- 系统创建线程所分配的资源相对创建进程而言,代价非常小。
Java中实现线程的方式目前有三种:
一:继承Thread类创建线程类
package com.clzhang.sample.thread; // 通过继承Thread类来创建线程类
public class ThreadByExtends extends Thread {
private int i; @Override
public void run() {
// 当线程类继承Thread类时,直接使用this即可获取当前线程句柄。
// 因此可以直接调用getName()方法返回当前线程的名称。
System.out.println("当前线程名称是:" + getName()); for (; i < 5; i++) {
System.out.println(getName() + ":" + i);
try {
// 保证让别的线程也有执行的机会
Thread.sleep(10);
} catch (InterruptedException e) {
}
}
} public static void main(String[] args) {
// 静态方法没有this,只能通过Thread.currentThread获取当前线程句柄
System.out.println(Thread.currentThread().getName()); // 创建、并启动第一条线程
new ThreadByExtends().start();
// 创建、并启动第二条线程
new ThreadByExtends().start();
}
}
输出:
main
当前线程名称是:Thread-0
Thread-0:0
当前线程名称是:Thread-1
Thread-1:0
Thread-0:1
Thread-1:1
Thread-1:2
Thread-0:2
Thread-1:3
Thread-0:3
Thread-0:4
Thread-1:4
二:实现Runnable接口创建线程类
package com.clzhang.sample.thread; /**
* 通过实现Runnable接口来创建线程类
* 1.Runnable非常适合多个相同线程来处理同一份资源的情况
* 2.Runnable可以避免由于Java的单继承机制带来的局限
* 3.如果想获取当前线程句柄,只能用Thread.currentThread()方法
*/
public class ThreadByRunnable implements Runnable {
private int i; @Override
public void run() {
System.out.println("当前线程名称是:" + Thread.currentThread().getName()); for (; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i); try {
// 因为sleep是静态方法,所以不需要通过Thread.currentThread()方法获取当前线程句柄
Thread.sleep(10);
} catch (InterruptedException e) {
}
}
} public static void main(String[] args) {
ThreadByRunnable st = new ThreadByRunnable();
new Thread(st, "新线程1").start();
new Thread(st, "新线程2").start();
}
}
输出:
当前线程名称是:新线程1
当前线程名称是:新线程2
新线程2:0
新线程1:0
新线程2:2
新线程1:2
新线程2:3
新线程1:4
三:使用Calable和Future创建具备返回值的线程
package com.clzhang.sample.thread; import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; // 实现Callable接口来实现线程
public class ThreadByCallable implements Callable<Integer> { @Override
public Integer call() {
System.out.println("当前线程名称是:" + Thread.currentThread().getName()); int i = 0;
for (; i < 5; i++) {
System.out.println("循环变量i的值:" + i);
} // call()方法有返回值
return i;
} public static void main(String[] args) {
ThreadByCallable rt = new ThreadByCallable(); // 使用FutureTask来包装Callable对象
FutureTask<Integer> task = new FutureTask<Integer>(rt);
new Thread(task, "有返回值的线程").start();
try {
// 获取线程返回值
System.out.println("子线程的返回值:" + task.get());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
输出:
当前线程名称是:有返回值的线程
循环变量i的值:0
循环变量i的值:1
循环变量i的值:2
循环变量i的值:3
循环变量i的值:4
子线程的返回值:5
总结
用Runnable与Callable接口的方式创建多线程的特点:
- 线程类只是实现了Runnable接口或Callable接口,还可以继承其它类。
- 在这种方式下,多个线程可以共享一个target对象,所以非常适合多个线程来处理同一份资源情况。
- 如果需要访问当前线程,需要使用Thread.currentThread方法。
- Callable接口与Runnable接口相比,只是Callable接口可以返回值而已。
用Thread类的方式创建多线程的特点:
- 因为线程已经继承Thread类,所以不可以再继承其它类。
- 如果需要访问当前线程,直接使用this即可。
Java:多线程,分别用Thread、Runnable、Callable实现线程的更多相关文章
- Java 多线程 socket 取款例子 runnable callable
socket部分参考 http://blog.csdn.net/kongxx/article/details/7259465 取款部分参考 http://blog.csdn.net/dayday198 ...
- Java多线程专题3: Thread和ThreadLocal
合集目录 Java多线程专题3: Thread和ThreadLocal 进程, 线程, 协程的区别 进程 Process 进程提供了执行一个程序所需要的所有资源, 一个进程的资源包括虚拟的地址空间, ...
- Java多线程带返回值的Callable接口
Java多线程带返回值的Callable接口 在面试的时候,有时候是不是会遇到面试会问你,Java中实现多线程的方式有几种?你知道吗?你知道Java中有可以返回值的线程吗?在具体的用法你知道吗?如果两 ...
- java多线程(二)之实现Runnable接口
一.java多线程方式2: 实现Runnable接口 好处:a. 可以避免由于java单继承带来的局限性. b. 适合多个相同的程序的代码去处理同一个资源的情况, 把线程与程序的代码, 数据有效分离, ...
- Java多线程4:Thread中的静态方法
一.Thread类中的静态方法 Thread类中的静态方法是通过Thread.方法名来调用的,那么问题来了,这个Thread指的是哪个Thread,是所在位置对应的那个Thread嘛?通过下面的例子可 ...
- Java 多线程基础(十)interrupt()和线程终止方式
Java 多线程基础(十)interrupt()和线程终止方式 一.interrupt() 介绍 interrupt() 定义在 Thread 类中,作用是中断本线程. 本线程中断自己是被允许的:其它 ...
- “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- java多线程创建-Thread,Runnable,callable和threadpool
java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如 ...
- Java多线程3:Thread中的实例方法
一.Thread类中的方法调用方式 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: ...
随机推荐
- jquery制作一个简单的轮播
效果图: 演示地址: http://ae6623.cn/demo/slider/index.html 思路: 利用css的定位属性 left 进行调整图片的显示,每次点击上一页下一页按钮的时候,-图片 ...
- JS字符串false转boolean
大家都知道在JS的世界里, 0.-0.null."".false.undefined 或 NaN,这些都可以自动转化为布尔的 false,那么字符串的"false&quo ...
- LINUX设备驱动程序笔记(五)中断处理
<一> 中断处理流程例如以下: 1.发生中断时,CPU运行异常向量vector_irq的代码. 2.在vector_irq里面.终于会调用中断处理的总入口函数asm_do_IRQ ...
- 表结构变更后出现的ERROR OGG-01161 Bad column index (88)
2014-07-31 09:38:31 ERROR OGG-01668 PROCESS ABENDING. 2014-07-31 09:38:31 ERROR OGG-01161 Bad column ...
- WebService 与 Socket 区别
一.WebService 1.什么是WebService Web Service(WEB服务)能够快捷和方便地综合结合各种系统.商务和任何应用平台.利用最新的Web Service 标准能够使任何软件 ...
- 【转】TCP/IP详解学习笔记(二)
TCP/IP详解学习笔记(5)-IP选路,动态选路,和一些细节 1.静态IP选路 1.1.一个简单的路由表 选路是IP层最重要的一个功能之一.前面的部分已经简单的讲过路由器是通过何种规则来根据IP数据 ...
- linux 用户管理,用户权限管理,用户组管理
linux 用户管理,用户权限管理,用户组管理 一:ls -l 命令 解释 第个d表示是目录,如果是文件是-,如果是连接是l 第2到4个 rwx 表示创建者的操作权限 r 读,w 写,x 执行 第5到 ...
- 算法笔记_120:蓝桥杯第六届省赛(Java语言B组部分习题)试题解答
目录 1 三角形面积 2 立方变自身 3 三羊献瑞 4 九数组分数 5 饮料换购 6 生命之树 前言:以下试题解答代码部分仅供参考,若有不当之处,还请路过的同学提醒一下~ 1 三角形面积 三角形 ...
- 【原创】浅析密码学在互联网支付中的应用|RSA,Hash,AES,DES,3DES,SHA1,SHA256,MD5,SSL,Private Key,Public Key
一)概述 什么是互联网支付? 当支付遇到互联网,一场革命自然不可避免.成为现实的是传统的现金支付已经“退居二线”,各种在线支付方式成为人们日常消费的主要支付方式.银行推出的网银以及第三方支付公司推出的 ...
- eclipse javaWeb项目如何引入jar包
eclipse javaWeb项目如何引入jar包 CreateTime--2018年4月19日08:54:24 Author:Marydon 1.判断当前jar包是否已经引入到项目当中的3种方式 ...