java并发学习--第一章 线程的创建
所谓的并发就是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。所以我们看似几个线程在同时进行,其实在操作系统中实际只会运行一个线程,并发过程就是快速切换线程的执行过程。
一、java中自带的线程创建方式
1.通过基础Thread
类,实现其run方法,完成线程创建
public class OneThread extends Thread { //run方法就是线程要执行的方法
public void run(){
System.out.println("这是一个线程");
} public static void main(String[] args) {
OneThread oneThread=new OneThread();
//通过线程的实例调用start方法,执行线程run方法
oneThread.start();
} }
2.通过声明Runnable 接口,实现run方法,创建线程
public class ThreadDemo implements Runnable { @Override
public void run() {
System.out.println("这是Runnable接口实现的线程");
} public static void main(String[] args) {
//先创建线程的实例
ThreadDemo threadDemo = new ThreadDemo();
//将线程放入thread方法中
Thread thread = new Thread(threadDemo);
//启动线程
thread.start(); }
}
3.带返回值的线程,实现Callable<返回值类型>
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; public class ThreadDemo implements Callable<String> { public static void main(String[] args) throws ExecutionException, InterruptedException {
ThreadDemo threadDemo = new ThreadDemo();
//将线程任务放入FutureTask中
FutureTask<String> task = new FutureTask<>(threadDemo);
//将task放入Thread类中
Thread thread = new Thread(task);
//开始线程任务
thread.start();
//获得执行的结构
String str = task.get();
System.out.println(str); } /**
* 线程任务的方法,声明Callable接口重写的线程任务方法
*
* @return
* @throws Exception
*/
@Override
public String call() throws Exception {
return "这是一个带返回值的线程";
}
}
二、线程池的创建
java中为我们提供了四种创建线程池的方式:
1.newCachedThreadPool:一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
public class ThreadDemo extends Thread { //用static修饰表示该线程池只创建一次
static ExecutorService CachedExecutor = Executors.newCachedThreadPool(); public static void main(String[] args) {
//创建线程实例
ThreadDemo threadDemo = new ThreadDemo();
//将线程丢进线程池中
CachedExecutor.execute(threadDemo); } @Override
public void run() {
System.out.println("这是一个线程");
}
}
2.newFixedThreadPool:一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
public class ThreadDemo extends Thread { //用static修饰表示该线程池只创建一次
static ExecutorService fixedExecutor = Executors.newFixedThreadPool(5); public static void main(String[] args) {
//创建线程实例
ThreadDemo threadDemo = new ThreadDemo();
//将线程丢进线程池中
fixedExecutor.execute(threadDemo); } @Override
public void run() {
System.out.println("这是一个线程");
}
}
3.newScheduledThreadPool:这是一个定时器的任务线程池,其中第三个参数TimeUnit类,可以参考https://www.cnblogs.com/zhaoyanjun/p/5486726.html
public class ThreadDemo extends Thread { //用static修饰表示该线程池只创建一次
static ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(5); public static void main(String[] args) {
//创建线程实例
ThreadDemo threadDemo = new ThreadDemo();
//定时器任务的线程,三个参数意义是:1.线程任务 2.时间的次数 3.时间的粒度
//该方法的意义是每5分钟一次执行线程threadDemo
scheduledExecutor.schedule(threadDemo, 5, TimeUnit.MINUTES); } @Override
public void run() {
System.out.println("这是一个线程");
}
}
4.newSingleThreadExecutor:按顺序来执行线程任务 但是不同于单线程,这个线程池只是只能存在一个线程,这个线程死后另外一个线程会补上。
public class ThreadDemo extends Thread { //用static修饰表示该线程池只创建一次
static ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); public static void main(String[] args) {
//创建线程实例
ThreadDemo threadDemo = new ThreadDemo();
//将线程放入线程池
singleThreadExecutor.execute(threadDemo); } @Override
public void run() {
System.out.println("这是一个线程");
}
}
java并发学习--第一章 线程的创建的更多相关文章
- java并发学习--第二章 spring boot实现线程的创建
除了之前介绍的创建线程方式外,spring boot为我们了提供一套完整的线程创建方式,其中包括了:线程.线程池.线程的监控. 一.使用spring boot提供的方法创建线程与线程池 1.首先在sp ...
- java并发编程--第一章并发编程的挑战
一.java并发编程的挑战 并发编程需要注意的问题: 并发编程的目的是让程序运行的更快,然而并不是启动更多的线程就能让程序最大限度的并发执行.若希望通过多线程并发让程序执行的更快,会受到如下问题的挑战 ...
- Java并发编程(01):线程的创建方式,状态周期管理
本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...
- java并发学习--第九章 指令重排序
一.happns-before happns-before是学习指令重排序前的一个必须了解的知识点,他的作用主要是就是用来判断代码的执行顺序. 1.定义 happens-before是用来指定两个操作 ...
- Java并发学习(一):进程和线程
好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 俗话说得好"一人 ...
- 【Todo】Java并发学习 & 示例练习及代码
接上一篇:http://www.cnblogs.com/charlesblc/p/6097111.html <Java并发学习 & Executor学习 & 异常逃逸 & ...
- Java并发编程系列-(2) 线程的并发工具类
2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...
- web学习第一章
web学习第一章 我是大概9月10日开始走上IT之路的,一开始学习了小段时间的自动化办公软件, 昨天我开始学习客户端网页编程,我了解什么是WEB,一些比较老古董的计算模式和发展历史,印象最让我深刻 ...
- C++11并发学习之三:线程同步(转载)
C++11并发学习之三:线程同步 1.<mutex> 头文件介绍 Mutex又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mutex> 头文 ...
随机推荐
- Linux root用户与普通用户时间不一致
造成这种原因有多种,可能是安装软件时选的时区不是本国时间等等. 今天检查了root用户和oracle及grid用户的时间不一样,幸好数据库还没有正式应用,不然可能会造成时间差影响. 现在将同步的方法步 ...
- bootstrap select下拉框模糊搜索和动态绑定数据解决方法
此方法适合后台一次性返回所有数据好了废话不多说直接上代码: <!DOCTYPE html><html><head> <title>Bootstrap-s ...
- IDEA设置Ctrl+滚轮调整字体大小
IDEA设置Ctrl+滚轮调整字体大小(转载) 按Ctrl+Shift+A,出现搜索框 输入mouse: 点击打开这个设置:勾选 点击ok,之后就可以通过Ctrl+滚轮 调整字体大小了.
- redhat 6.8 配置 centos6 163 的 yum 源
1. 检查是否安装yum包[root@node1 rpms]# rpm -qa|grep yum 2. 删除自带的yum包[root@node1 rpms]# rpm -qa|grep yum|xar ...
- 消息队列之 ActiveMQ
简介 ActiveMQ 特点 ActiveMQ 是由 Apache 出品的一款开源消息中间件,旨在为应用程序提供高效.可扩展.稳定.安全的企业级消息通信. 它的设计目标是提供标准的.面向消息的.多语言 ...
- 架构-数据库访问-SQL语言进行连接数据库服务器-DB-Library:DB-Library
ylbtech-数据库访问-SQL语言进行连接数据库服务器-DB-Library:DB-Library 1.返回顶部 1. 在基于三层构架的信息系统开发中,应用服务器要利用SQL语言进行连接数据库服务 ...
- EF2:Entity Mysql Sample
1)概念 Entity Framework: 全称ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架.百 ...
- 当在浏览器中输入一个url后回车,后台发生了什么?比如输入url后,你看到了百度的首页,那么这一切是如何发生的呢?
简单来书有以下步骤: 查找域名对应的IP地址.这一步会依次查找浏览器缓存,系统缓存,路由器缓存,ISPDNS缓存,13台根域名服务器. 向IP对应的服务器发送请求. 服务器响应请求,发回网页内容. 浏 ...
- java配置详解
JAVA_HOMED:\JavaTools\Java\jdk1.7.0_80\ D:\JavaEnvironment\Java\jdk1.7.0_71D:\JavaEnvironment\Java\j ...
- PHP 实现并发-进程控制 PCNTL
参考 基于PCNTL的PHP并发编程 PCNTL 是 PHP 中的一组进程控制函数,可以用来 fork(创建)进程,传输控制信号等. 在PHP中,进程控制支持默认关闭.编译时通过 --enable-p ...