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> 头文 ...
随机推荐
- canvas介绍(画布)
canvas(画布)主要是位图 svg(矢量图) canvas标签,必须要写的3个属性 id width height 为什么不再style中设置width和height呢? 因为这设置width和h ...
- sudo无需输入密码设置
注意这个是无需输入密码的设置,不是无需输入sudo 1 在终端输入: sudo gedit /etc/sudoers 2 在打开文件中的root ALL=(ALL:ALL) ALL下一行添加&qu ...
- lateral view 使用方法
这个函数相当于拆开行变成列. 可以理解为行转列. select id,order_label from table_bx lateral view explode(split(work_order_l ...
- 【ABAP系列】SAP ABAP 关于ALV布局保存选项的讲解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP ABAP 关于ALV布局保存 ...
- 前端 CSS层叠性 CSS选择器优先级
层叠性 层叠性:权重的标签覆盖掉了权重小的标签,说白了 ,就是被干掉了 权重:谁的权重大,浏览器就会显示谁的属性 我们现在已经学过了很多的选择器,也就是说在一个HTML页面中有很多种方式找到一个元素并 ...
- [Git] 006 在本地新建一个仓库
1. 方法一 1.1 思路 在 GitHub 上新建一个仓库 clone 到本地 1.2 行动 1.2.1 在 GitHub 上选好自己已有的仓库 点击 "Clone or download ...
- Win10不能远程其他远程计算机的解决办法
Win10不能远程其他远程计算机的解决办法 转自: https://blog.csdn.net/qq_38197830/article/details/69488236 首先打开控制面板——> ...
- Java-集合第五篇Map集合
1.什么是Map集合. Map用于保存具有映射关系的数据.key和value都可以是任意引用类型,但key不允许重复,即同一个Map的任何两个key通过equals方法比较总是返回false. 从Ja ...
- 探究Javascript模板引擎mustache.js使用方法
这篇文章主要为大家介绍了Javascript模板引擎mustache.js使用方法,mustache.js是一个简单强大的Javascript模板引擎,使用它可以简化在js代码中的html编写,压缩后 ...
- 从零开始学编程_第A001期_C语言HelloWorld详解
emmm,这是我的第一篇博客. 作为一个软件工程专业的学生,我希望自己能在编程方面有不错的成就,我们老师告诉我们学编程就要写博客,在写博客的过程中不断成长,结交朋友,所以我就开始尝试写专业相关的博客. ...