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

一、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. Qt 之 ZIP开源库 QuaZIP

    2013-10-31 21:46 10856人阅读 评论(0) 收藏 举报  分类: Qt(12)  版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   一.简介     ...

  2. Oracle JET(二)Oracle JET使用

    Oracle JET 开发分为 Web 应用程序开发和移动应用程序开发(WebApp). Oracle JET Web 应用程序开发入门: 使用方法三种: 使用 Oracle JET Yeoman 生 ...

  3. HTML,CSS,JS个别知识点总结

    <input>是自闭合标签,没有<input></input>一说,只能写作<input/>. <div>可以是行标签也可以作为块标签,作为 ...

  4. C++类前置声明

    cpp前置声明: 前置声明只能作为指针或引用,不能定义类的对象,也不能调用对象中的方法. 详见:https://www.cnblogs.com/dobben/p/7440745.html

  5. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_2_对象的序列化流_ObjectOutputStream

    创建person对象.生成构造方法全参和无参.getter和setter 抛出异常:没有序列化异常 接口的源码 啥都没有.就起到一个标记的作用 用二进制存的

  6. jt获取鼠标指针的位置

    屏幕 screenX和screenY属性表示鼠标在整个显示屏的位置,从屏幕(而不是浏览器)的左上角开始计算的. 页面 pageX和pageY属性表示鼠标指针在这个页面的位置.页面的顶部可能在可见区域之 ...

  7. springboot An incompatible version [1.1.32] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]

    1.错误 An incompatible version [1.1.32] of the APR based Apache Tomcat Native library is installed, wh ...

  8. ETROBOT——审题

    参加了比赛,但是总要理解比赛相关的东西,发现以前瞎写的东西有人看,并且还有挺多人看的,所以打算继续在这里面,做记录. 源: http://www.etrobo.jp/2018/gaiyou/intro ...

  9. 剑指offer--day06

    1.1 题目:调整数组顺序使奇数位语偶数前面:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的 ...

  10. ModelForm基本使用

    介绍 Django提供Form和ModelForm两种表单验证方式.相比较Form,ModelForm可以直接与与数据库表相关联,不需要像Form那样需要手动逐一字段添加表单验证的字段.且可以随意选择 ...