java并发编程基础——线程的创建
一、基础概念
1、进程和线程
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位)
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
2、并发性和并行性
并行:是指同一时刻,有多条指令在多个处理器上同时执行
并发:是指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行。通常多个进程可以在当个处理器上并发执行。
3、多进程和多线程
多进程:指操作系统上同时运行多个任务
多线程:某个进程,并发处理多个任务(同一个程序中有多个程序流在执行)
二、线程的创建和启动
在java中要想实现多线程,有三种方式
1、继承Thread类(使用继承Thread类的方式来创建线程类时,多个线程之间无法共享线程类的实例变量)
package threadtest;
public class FirstThread extends Thread { private String name;
public FirstThread(String name) {
this.name = name;
}
public void run() {
for(int i=0; i<10; i++) {
System.out.println(name + ": " +i + "****"+Thread.currentThread().getName());
}
} public static void main(String[] args) {
FirstThread t1 = new FirstThread("thread1");
FirstThread t2 = new FirstThread("thread2");
t1.start();
t2.start();
System.out.println(Thread.currentThread().getName()); }
}
2、实现Runnable接口(使用实现Runnable接口的方式来创建线程类时,多个线程之间共享线程类的实例变量)
package threadtest;
public class SecondThread implements Runnable{ private String name;
public SecondThread(String name) {
this.name = name;
}
int i=0;
@Override
public void run() {
for(;i<10;i++) {
System.out.println(name + ": "+i+"****"+Thread.currentThread().getName());
}
} public static void main(String[] args) {
SecondThread st = new SecondThread("secondThread");
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
Thread t3 = new Thread(st,"线程3");//可以指定线程名称
t1.start();
t2.start();
t3.start();
System.out.println(Thread.currentThread().getName()); }
}
3、实现Callable接口和Future
用Callable接口创建启动多线程的步骤
(1)创建Callable接口实现类,并实现call()方法
(2)创建Callable实现类的实例,使用FutureTask类包装Callable对象
(3)使用FutureTask对象做为Thread对象的target创建并启动新的线程
(4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
package threadtest;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; public class ThirdThread implements Callable<Integer>{ private String name;
public ThirdThread(String name) {
this.name = name ;
}
int i=0;
@Override
public Integer call() throws Exception {
for(;i<10;i++) {
System.out.println(name + ": " + i +"****"+ Thread.currentThread().getName());
}
return i;
} public static void main(String[] args) { ThirdThread tt = new ThirdThread("thirdThread");
FutureTask<Integer> task1 = new FutureTask<>(tt);
FutureTask<Integer> task2 = new FutureTask<>(tt);
FutureTask<Integer> task3 = new FutureTask<>(tt);
Thread t1 = new Thread(task1);
Thread t2 = new Thread(task2);
Thread t3 = new Thread(task3,"线程3");
t1.start();
t2.start();
t3.start();
System.out.println(Thread.currentThread().getName()); } }
三种方式对比
通过上面三种方式都可以实现多线程,其中实现Runnable接口和实现Callable接口的方式基本相同,只是Callable接口里的方法有返回值,可以声明抛出异常。所以这两种方式可以归为一类
实现Runnable接口和实现Callable接口的方式
优势:
(1)线程类只实现了接口,还可以集成其他类
(2)多个线程可以共享一个target对象,非常适合多个线程来处理同一份资源的情况。代码和数据独立。
劣势:
(1)编程稍微复杂
继承Thread类方式
优势:
(1)编写简单
劣势:
(1)已经继承了Thread类,不能继承其他类
开发中一般推荐采用Runnable接口、Callable接口的方式来实现多线程。
java并发编程基础——线程的创建的更多相关文章
- Java并发编程:线程的创建
Java并发编程:线程的创建 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} J ...
- Java并发编程基础-线程安全问题及JMM(volatile)
什么情况下应该使用多线程 : 线程出现的目的是什么?解决进程中多任务的实时性问题?其实简单来说,也就是解决“阻塞”的问题,阻塞的意思就是程序运行到某个函数或过程后等待某些事件发生而暂时停止 CPU 占 ...
- java并发编程基础——线程相关的类
线程相关类 java还为线程安全提供了一些工具类. 一.ThreadLocal类(Thread Local Variable) ThreadLocal类,是线程局部变量的意思.功用非常简单,就是为每一 ...
- java并发编程基础——线程池
线程池 由于启动一个线程要与操作系统交互,所以系统启动一个新的线程的成本是比较高的.在这种情况下,使用线程池可以很好的提升性能,特别是程序中涉及创建大量生命周期很短暂的线程时. 与数据库连接池类似,线 ...
- java并发编程基础——线程同步
线程同步 一.线程安全问题 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安 ...
- java并发编程基础——线程通信
线程通信 当线程在系统内运行时,程序通常无法准确的控制线程的轮换执行,但我们可以通过一些机制来保障线程的协调运行 一.传统的线程通信 传统的线程通信主要是通过Object类提供的wait(),noti ...
- Java并发编程基础
Java并发编程基础 1. 并发 1.1. 什么是并发? 并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力.如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互 ...
- 并发-Java并发编程基础
Java并发编程基础 并发 在计算机科学中,并发是指将一个程序,算法划分为若干个逻辑组成部分,这些部分可以以任何顺序进行执行,但与最终顺序执行的结果一致.并发可以在多核操作系统上显著的提高程序运行速度 ...
- Java并发编程--基础进阶高级(完结)
Java并发编程--基础进阶高级完整笔记. 这都不知道是第几次刷狂神的JUC并发编程了,从第一次的迷茫到现在比较清晰,算是个大进步了,之前JUC笔记不见了,重新做一套笔记. 参考链接:https:// ...
随机推荐
- java接口类
是什么:类似于java中的继承,但是继承只可以继承一个人父类,接口类可以继承多个 作用:解决java继承解决不了的问题 关键字:interface(定义) implements(使用) 注意事项:1. ...
- python+selenium_鼠标事件
引言--在实际的web产品测试中,对于鼠标的操作,不单单只有click(),有时候还要用到右击.双击.拖动等操作,这些操作包含在ActionChains类中. 一.ActionChains类中鼠标操作 ...
- Java面试指北!13个认证授权常见面试题/知识点总结!| JavaGuide
大家好,我是 Guide哥!端午已过,又要开始工作学习啦! 我发现有很多小伙伴对认证授权方面的知识不是特别了解,搞不清 Session 认证.JWT 以及 Cookie 这些概念. 所以,根据我根据日 ...
- Java必学MySQL数据库应用场景
Java教程分享Java必学之MySQL数据库应用场景,在当前的后台开发中,MySQL应用非常普遍,企业在选拔Java人才时也会考察求职者诸如性能优化.高可用性.备份.集群.负载均衡.读写分离等问题. ...
- Apache Hudi在Hopworks机器学习的应用
Hopsworks特征存储库统一了在线和批处理应用程序的特征访问而屏蔽了双数据库系统的复杂性.我们构建了一个可靠且高性能的服务,以将特征物化到在线特征存储库,不仅仅保证低延迟访问,而且还保证在服务时间 ...
- 二、RabbitMQ 进阶特性及使用场景 [.NET]
前言 经过上一篇的介绍,相信大家对RabbitMQ 的各种概念有了一定的了解,及如何使用RabbitMQ.Client 去发送和消费消息. 特性及使用场景 1. TTL 过期时间 TTL可以用来指定q ...
- Spring学习日记03_IOC_属性注入_集合类型属性
Ioc操作Bean管理(xml注入集合属性) 注入数组类型属性 注入List集合类型属性 注入Map集合类型属性 Stu类 public class Stu { //1. 数组类型属性 private ...
- Linux-远程服务ssh
1.远程管理服务介绍 (1)SSH是(Secure Shell Protocol)的简写,由IETF网络工作小组制定:在进行数据传输之前,SSH先对联机数据包通过加密技术进行机密处理,加密后在进行文件 ...
- keycloak~管理平台的查询bug与自定rest中文检索
对于keycloak来说,它的管理平台在它的源码中的admin-client中,它会定义相关的rest接口规范:在我们使用keycloak管理平台时,其中有一个组的查询,在我们查询中文组时,它是不支持 ...
- SpringBoot | 1.1 SpringBoot简介
前言 本博客仅为记录与总结SpringBoot的学习笔记,资料来源: 书籍<深入浅出SpringBoot>第三版 B站尚硅谷<雷丰阳2021版SpringBoot2零基础入门> ...