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:// ...
随机推荐
- httprunner中的分层(api、testcase、testsuite)及实际使用
一.分层思想 api定义层:最底下的一层是api的定义层testcase层:测试用例层,调用定义层的内容testsuite:测试套件层 二.分层案例设计实现实践举例 1.api 层: 2.testca ...
- Java日期时间API系列39-----中文语句中的时间语义识别(time NLP 输入一句话,能识别出话里的时间)原理分析
NLP (Natural Language Processing) 是人工智能(AI)的一个子领域.自然语言是人类智慧的结晶,自然语言处理是人工智能中最为困难的问题之一(来自百度百科). 其中中文更是 ...
- 简单理解数据库连接池(JDBC)
为什么要使用连接池? 在我们写代码的时候,写了很多类,假如这些类都和数据库打交道.这样的话每个类都要去获取数据库连接,操作完了之后就把连接释放了. 要知道,获取数据库连接的操作其实是向操作系统底层去获 ...
- 密码学系列之:feistel cipher
密码学系列之:feistel cipher 简介 feistel cipher也叫做Luby–Rackoff分组密码,是用来构建分组加密算法的对称结构.它是由德籍密码学家Horst Feistel在I ...
- python中json.dump()与json.dumps()的区别
1.将python数据结构转换为json字符串(json.dumps()) >>> import json >>> data={'name':'pipi','age ...
- 【NX二次开发】Block UI 从列表选择部件
属性说明 属性 类型 描述 常规 BlockID String 控件ID Enable Logical 是否可操作 Group ...
- Java知识复习(一)
Java面向对象的三大特性: 封装.继承.多态. super()与this()的区别? This():当前类的实例,一个类,如果继承了父类,那么通过this既可以访问当前类的属性和方法,也可以访问父类 ...
- NXNSAttack漏洞简析
漏洞简介: 该漏洞为DNS 放大攻击,是 DDoS 攻击,攻击者利用 DNS 服务器中的漏洞将小查询转换为可能破坏目标服务器的更大负载. 在 NXNSAttack 的情况下,远程攻击者可以通过向易受攻 ...
- Lin语法(Linq对数据库操作)
一.Linq语句的应用: var queryAllCustomers = from cust in customers group cust by cust.City into custGroup ...
- Akamai CDN刷新(通过Akamai cli 自动刷新)
1.刷新类型选择 根据官方介绍,可使用多种途径和方式来完成快速刷新 按照简便快捷高效的要求,暂时选择Akamai cli + url 来完成刷新. 2.二进制文件下载地址 文件下载地址:https:/ ...