所谓的并发就是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。所以我们看似几个线程在同时进行,其实在操作系统中实际只会运行一个线程,并发过程就是快速切换线程的执行过程。

一、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并发学习--第一章 线程的创建的更多相关文章

  1. java并发学习--第二章 spring boot实现线程的创建

    除了之前介绍的创建线程方式外,spring boot为我们了提供一套完整的线程创建方式,其中包括了:线程.线程池.线程的监控. 一.使用spring boot提供的方法创建线程与线程池 1.首先在sp ...

  2. java并发编程--第一章并发编程的挑战

    一.java并发编程的挑战 并发编程需要注意的问题: 并发编程的目的是让程序运行的更快,然而并不是启动更多的线程就能让程序最大限度的并发执行.若希望通过多线程并发让程序执行的更快,会受到如下问题的挑战 ...

  3. Java并发编程(01):线程的创建方式,状态周期管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...

  4. java并发学习--第九章 指令重排序

    一.happns-before happns-before是学习指令重排序前的一个必须了解的知识点,他的作用主要是就是用来判断代码的执行顺序. 1.定义 happens-before是用来指定两个操作 ...

  5. Java并发学习(一):进程和线程

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 俗话说得好"一人 ...

  6. 【Todo】Java并发学习 & 示例练习及代码

    接上一篇:http://www.cnblogs.com/charlesblc/p/6097111.html <Java并发学习 & Executor学习 & 异常逃逸 & ...

  7. Java并发编程系列-(2) 线程的并发工具类

    2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...

  8. web学习第一章

    web学习第一章   我是大概9月10日开始走上IT之路的,一开始学习了小段时间的自动化办公软件, 昨天我开始学习客户端网页编程,我了解什么是WEB,一些比较老古董的计算模式和发展历史,印象最让我深刻 ...

  9. C++11并发学习之三:线程同步(转载)

    C++11并发学习之三:线程同步 1.<mutex> 头文件介绍 Mutex又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mutex> 头文 ...

随机推荐

  1. POJ 1380 Equipment Box (暴力枚举)

    Equipment Box 题目链接: http://acm.hust.edu.cn/vjudge/contest/130510#problem/B Description There is a la ...

  2. [CSP-S模拟测试]:星际旅行(欧拉路)

    题目传送门(内部题4) 输入格式 第一行两个整数$n,m$,表示行星和虫洞的数量.接下来$m$行,每行两个整数$u,v$,表示存在一个双向虫洞直接连接$u$和$v$.每一个虫洞最多会被描述一次. 输出 ...

  3. 文档流&文字&CSS常用命令

    文档流 文档流就是文档内元素流动方向 流动方向 内联元素从左往右流,宽度不够,之字形,且元素会被截断 块元素从上往下流动,一排一排 注意事项 内联元素中有英文单词,流动时宽度不够,英文单词会整体迁移, ...

  4. js方法返回多值如何取值demo

    js方法返回,如何取值?下面demo两种方法 new array 和 json 返回值 取值示例. 方法一:  new array <html> <head> <meta ...

  5. 箭头函数(Arrow Functions)

    ES5语法: var getPrice = function() { return 4.55; }; console.log(getPrice()); ES6 中,箭头函数就是函数的一种简写形式,使用 ...

  6. uva live 7635 National Bomb Defusing Squad

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  7. 字符串处理工具Guava使用总结

    字符串处理工具Guava使用总结 在java开发过程中对字符串的处理是非常频繁的,google的guava工具对字符串的一些处理进行优化,使我们开发过程中让自己的代码看去更加美观,清爽. 1:mave ...

  8. ReentrantLock 源码分析

    ReentrantLock 1)ReentrantLock 类实现了和 synchronized 一样的内存语义,同时该类提供了更加灵活多样的可重入互斥锁定操作. 2)ReentrantLock 实例 ...

  9. PANIC: Missing emulator engine program for ‘x86’ CPU.

    参考链接:https://zhidao.baidu.com/question/652153765084187325.html 解决方案:看图最上面路径,进入你的文件夹下,把红文件夹 ( 1 ) 中的所 ...

  10. 类Calendar

    /* * Calendar类概述及其方法 * * Calendar类概述 * Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR.MONTH.DAY_OF_MONTH.HOUR等 * 日历 ...