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

一、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. 学习wavenet_vocoder之预处理、训练

    一.预处理 1.在进行预处理时,如果不明白需要的参数,可以使用命令获取帮助,从这里我们可以看到可以具体的用法和对应的参数. python preprocess.py --help python pre ...

  2. spring MVC junit单元测试 各test之间共享变量

    使用静态变量   private static String iPSetCode=null;

  3. VXcode学习

    1.安装中文包(chinese) 2.打开控制面板ctrl+shift+p

  4. 大数据笔记(十二)——使用MRUnit进行单元测试

    package demo.wc; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.io.IntW ...

  5. SQL 多表查询的几种连接方式

    --创建数据库 create database GoodsSystem go --使用数据库 use GoodsSystem go --创建商品类型表 create table GoodsType ( ...

  6. vue2.0 之 douban (四)创建Swipe图片轮播组件

    swiper中文文档:http://www.swiper.com.cn 1.我们在components文件夹里创建一个swipe组件,将需要用到的js以及css文件复制到assets/lib文件夹下, ...

  7. React-Native 之 GD (十八)监听 TabBarItem 点击与传值实现 点击 Item 进行刷新功能

    监听 TabBarItem 点击与传值实现 点击 Item 进行刷新功能 原版 APP 中当我们点击 首页和海淘 2个 Item 时,会马上获取最新数据个数然后进行更新,这边来实现一下这个功能. 1. ...

  8. mysql的my.cnf参数详解

    转载[Mysql] MySQL配置文件my.cnf的理解 一.缘由 最近要接手数据库的维护工作,公司首选MySQL.对于MySQL的理解,我认为很多性能优化工作.主从主主复制都是在调整参数,来适应不同 ...

  9. fedora23深度配置gnome系统环境, 如设置ibus的面板字体大小 以及gedit 自动探测文件字符编码fileencodings

    除了系统桌面gnome, 以及gnome应用程序自带的preferences, 还有很多设置, 没有在preferences, 而是被深度地隐藏在系统中, 这时, 需要安装 dconf-tools: ...

  10. Java 之 回调方法

    打个比方,我们点外卖都有到达提醒的服务,顾客自己选择提醒的方式.可以是电话提醒.短信提醒.也可以敲门提醒,这里,“提醒”这个行为是美团或饿了么这样的平台提供的,相当于库函数,但是提醒的方式是由顾客决定 ...