一、基础概念

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并发编程基础——线程的创建的更多相关文章

  1. Java并发编程:线程的创建

    Java并发编程:线程的创建 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} J ...

  2. Java并发编程基础-线程安全问题及JMM(volatile)

    什么情况下应该使用多线程 : 线程出现的目的是什么?解决进程中多任务的实时性问题?其实简单来说,也就是解决“阻塞”的问题,阻塞的意思就是程序运行到某个函数或过程后等待某些事件发生而暂时停止 CPU 占 ...

  3. java并发编程基础——线程相关的类

    线程相关类 java还为线程安全提供了一些工具类. 一.ThreadLocal类(Thread Local Variable) ThreadLocal类,是线程局部变量的意思.功用非常简单,就是为每一 ...

  4. java并发编程基础——线程池

    线程池 由于启动一个线程要与操作系统交互,所以系统启动一个新的线程的成本是比较高的.在这种情况下,使用线程池可以很好的提升性能,特别是程序中涉及创建大量生命周期很短暂的线程时. 与数据库连接池类似,线 ...

  5. java并发编程基础——线程同步

    线程同步 一.线程安全问题 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安 ...

  6. java并发编程基础——线程通信

    线程通信 当线程在系统内运行时,程序通常无法准确的控制线程的轮换执行,但我们可以通过一些机制来保障线程的协调运行 一.传统的线程通信 传统的线程通信主要是通过Object类提供的wait(),noti ...

  7. Java并发编程基础

    Java并发编程基础 1. 并发 1.1. 什么是并发? 并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力.如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互 ...

  8. 并发-Java并发编程基础

    Java并发编程基础 并发 在计算机科学中,并发是指将一个程序,算法划分为若干个逻辑组成部分,这些部分可以以任何顺序进行执行,但与最终顺序执行的结果一致.并发可以在多核操作系统上显著的提高程序运行速度 ...

  9. Java并发编程--基础进阶高级(完结)

    Java并发编程--基础进阶高级完整笔记. 这都不知道是第几次刷狂神的JUC并发编程了,从第一次的迷茫到现在比较清晰,算是个大进步了,之前JUC笔记不见了,重新做一套笔记. 参考链接:https:// ...

随机推荐

  1. 3D深度估计

    3D深度估计 Consistent Video Depth Estimation 论文地址:https://arxiv.org/pdf/2004.15021.pdf 项目网站:https://roxa ...

  2. TensorFlow基础剖析

    TensorFlow基础剖析 一.概述 TensorFlow 是一个使用数据流图 (Dataflow Graph) 表达数值计算的开源软件库.它使 用节点表示抽象的数学计算,并使用 OP 表达计算的逻 ...

  3. 马斯克如何颠覆航天? 1/5385成本,c++和python编程!

    马斯克如何颠覆航天? 1/5385成本,c++和python编程! 5月31日,经历了重重困难,马斯克的SpaceX载人飞船成功发射,这是美国自2011年以来首次发射载人航天飞船,也是美国进入由商业主 ...

  4. Linux内存技术分析(下)

    Linux内存技术分析(下) 五.内存使用场景 out of memory 的时代过去了吗?no,内存再充足也不可任性使用. 1.内存的使用场景 page 管理 slab(kmalloc.内存池) 用 ...

  5. .NET 6 亮点之工作负载,它是统一 .NET 的基础

    随着.NET 6 Preview 5的发布,大家认真的看相关文章或者是动手做一个MAUI示例的时候就会碰到一个新概念工作负载(workload),相关规范参见 https://github.com/d ...

  6. Spring Cloud Gateway简单入门,强大的微服务网关

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 见名知义,Spring Cloud Gateway是用于微服务场景的网关组件,它是基于Spring WebFlu ...

  7. Java中JVM、JRE和JDK三者有什么区别和联系?

    Java 语言的开发运行,也离不开 Java 语言的运行环境 JRE.没有 JRE 的支持,Java 语言便无法运行.当然,如果还想编译 Java 程序,搞搞小开发的话,JRE 是明显不够了,这时候就 ...

  8. 如何开启O2优化

    O2环境会使你的程序跑的特别快,然而大多数正式考试都不能开O2 然而平时做有些题强制开O2,会出现在本机运行正确,但是交上去RE的情况,这时你就要开O2了. 例如在本机运行时会有下标为-但可以运行,而 ...

  9. conn / as sysdba连接不上

    问题: SQL> conn / as sysdbaERROR:ORA-09817: Write to audit file failed.Linux-x86_64 Error: 28: No s ...

  10. 2021年Wordpress博客装修美化(二)

    使用古腾堡来排版页面 废话不多说,我们直接开始吧,今天主要来聊聊如何使用Wordpress自带的可视化页面编辑器.我相信只有驾驭最基础的可视化排版,后面才能对高级版本的扩展可视化编辑器elemento ...