方法一:继承Thread类,作为线程对象存在(继承Thread对象)

public class CreatThreadDemo1 extends Thread{/*** 构造方法: 继承父类方法的Thread(String name);方法* @param name*/public CreatThreadDemo1(String name){super(name);}@Overridepublic void run() {while (!interrupted()){System.out.println(getName()+"线程执行了...");try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {CreatThreadDemo1 d1 = new CreatThreadDemo1("first");CreatThreadDemo1 d2 = new CreatThreadDemo1("second");d1.start();d2.start();d1.interrupt();  //中断第一个线程}
}

常规方法,不多做介绍了,interrupted方法,是来判断该线程是否被中断。(终止线程不允许用stop方法,该方法不会施放占用的资源。所以我们在设计程序的时候,要按照中断线程的思维去设计,就像上面的代码一样)。

让线程等待的方法
  • Thread.sleep(200); //线程休息2ms
  • Object.wait(); //让线程进入等待,直到调用Object的notify或者notifyAll时,线程停止休眠

方法二:实现runnable接口,作为线程任务存在

public class CreatThreadDemo2 implements Runnable {@Overridepublic void run() {while (true){System.out.println("线程执行了...");}}public static void main(String[] args) {//将线程任务传给线程对象Thread thread = new Thread(new CreatThreadDemo2());//启动线程thread.start();}
}

Runnable 只是来修饰线程所执行的任务,它不是一个线程对象。想要启动Runnable对象,必须将它放到一个线程对象里。

方法三:匿名内部类创建线程对象

public class CreatThreadDemo3 extends Thread{public static void main(String[] args) {//创建无参线程对象new Thread(){@Overridepublic void run() {System.out.println("线程执行了...");}}.start();//创建带线程任务的线程对象new Thread(new Runnable() {@Overridepublic void run() {System.out.println("线程执行了...");}}).start();//创建带线程任务并且重写run方法的线程对象new Thread(new Runnable() {@Overridepublic void run() {System.out.println("runnable run 线程执行了...");}}){@Overridepublic void run() {System.out.println("override run 线程执行了...");}}.start();}}

创建带线程任务并且重写run方法的线程对象中,为什么只运行了Thread的run方法。我们看看Thread类的源码,

image.png

,我们可以看到Thread实现了Runnable接口,而Runnable接口里有一个run方法。
所以,我们最终调用的重写的方法应该是Thread类的run方法。而不是Runnable接口的run方法。

方法四:创建带返回值的线程

public class CreatThreadDemo4 implements Callable {public static void main(String[] args) throws ExecutionException, InterruptedException {CreatThreadDemo4 demo4 = new CreatThreadDemo4();FutureTask<Integer> task = new FutureTask<Integer>(demo4); //FutureTask最终实现的是runnable接口Thread thread = new Thread(task);thread.start();System.out.println("我可以在这里做点别的业务逻辑...因为FutureTask是提前完成任务");//拿出线程执行的返回值Integer result = task.get();System.out.println("线程中运算的结果为:"+result);}//重写Callable接口的call方法@Overridepublic Object call() throws Exception {int result = 1;System.out.println("业务逻辑计算中...");Thread.sleep(3000);return result;}
}

Callable接口介绍:

public interface Callable<V> {/*** Computes a result, or throws an exception if unable to do so.** @return computed result* @throws Exception if unable to compute a result*/V call() throws Exception;
}

返回指定泛型的call方法。然后调用FutureTask对象的get方法得道call方法的返回值。

方法五:定时器Timer

public class CreatThreadDemo5 {public static void main(String[] args) {Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("定时器线程执行了...");}},0,1000);   //延迟0,周期1s}
}

方法六:线程池创建线程

public class CreatThreadDemo6 {public static void main(String[] args) {//创建一个具有10个线程的线程池ExecutorService threadPool = Executors.newFixedThreadPool(10);long threadpoolUseTime = System.currentTimeMillis();for (int i = 0;i<10;i++){threadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"线程执行了...");}});}long threadpoolUseTime1 = System.currentTimeMillis();System.out.println("多线程用时"+(threadpoolUseTime1-threadpoolUseTime));//销毁线程池threadPool.shutdown();threadpoolUseTime = System.currentTimeMillis();}}

方法七:利用java8新特性 stream 实现并发

lambda表达式不懂的,可以看看我的java8新特性文章:
java8-lambda:https://www.jianshu.com/p/3a08dc78a05f
java8-stream:https://www.jianshu.com/p/ea16d6712a00

public class CreatThreadDemo7 {public static void main(String[] args) {List<Integer> values = Arrays.asList(10,20,30,40);//parallel 平行的,并行的int result = values.parallelStream().mapToInt(p -> p*2).sum();System.out.println(result);//怎么证明它是并发处理呢values.parallelStream().forEach(p-> System.out.println(p));}
}
200
40
10
20
30

怎么证明它是并发处理呢,他们并不是按照顺序输出的 。

Java并发编程(一)线程的各种创建方式相关推荐

  1. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

  2. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

    文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...

  3. JAVA并发编程3_线程同步之synchronized关键字

    在上一篇博客里讲解了JAVA的线程的内存模型,见:JAVA并发编程2_线程安全&内存模型,接着上一篇提到的问题解决多线程共享资源的情况下的线程安全问题. 不安全线程分析 public clas ...

  4. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  5. Java并发编程:线程的同步

    <?xml version="1.0" encoding="utf-8"?> Java并发编程:线程的同步 Java并发编程:线程的同步 Table ...

  6. Java并发编程一线程池简介

    推荐:Java并发编程汇总 Java并发编程一线程池简介 为什么我们需要使用线程池? 我们知道线程是一种比较昂贵的资源,我们通过程序每创建一个线程去执行,其实操作系统都会对应地创建一个线程去执行我们的 ...

  7. Java并发编程一线程池的五种状态

    推荐:Java并发编程汇总 Java并发编程一线程池的五种状态 原文地址 Java多线程线程池(4)–线程池的五种状态 正文 线程池的5种状态:Running.ShutDown.Stop.Tidyin ...

  8. Java并发编程:线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

  9. (转)Java并发编程:线程池的使用

    背景:线程池在面试时候经常遇到,反复出现的问题就是理解不深入,不能做到游刃有余.所以这篇博客是要深入总结线程池的使用. ThreadPoolExecutor的继承关系 线程池的原理 1.线程池状态(4 ...

  10. java并发编程与线程安全

    2019独角兽企业重金招聘Python工程师标准>>> 什么是线程安全 如果对象的状态变量(对象的实例域.静态域)具有可变性,那么当该对象被多个线程共享时就的考虑线程安全性的问题,否 ...

最新文章

  1. tomcat 连接oracle重连,JSP+Tomcat连接Oracle数据库
  2. android 中组件继承关系图,一目了然
  3. 导入项目时中文乱码的消除
  4. 你不是颠覆 IoT,就是被 IoT 颠覆!
  5. 安卓自定义列表dialog
  6. python %号_python基础集结号
  7. 计算机无法打印图片,Win7电脑连接打印机可以打印文档不能打印图片怎么办
  8. 主成分分析逆变换_主成分分析方法操作
  9. 吉林大学操作系统上机随笔《实验二》
  10. 晚安西南-----地破实验
  11. TTE时间触发以太网
  12. 利用Rustlings对Rust语言进行学习
  13. 在MobaXterm使用命令tree出现乱码解决办法locale的设定及LANG、LC_CTYPE、LC_ALL环境变量
  14. 【软件使用】去除图片上一些文字之类的:
  15. 新MSN Messenger 7 功能展示!
  16. 【Linux基础】Linux软件包管理器yum的使用指南rzsz安装
  17. 读书 | 可复制的领导力(内含思维导图)
  18. docker部署轻量级文件浏览器------filebrowser
  19. 计算机专业题库,计算机专业试题大全(超级题库,答案)
  20. Java数据结构之二分查找/插值查找/斐波那契查找

热门文章

  1. boost::geometry::strategy::distance::pythagoras_point_box用法的测试程序
  2. GDCM:gdcm::Unpacker12Bits的测试程序
  3. boost::callable_traits的has_void_return的测试程序
  4. Boost:宏BOOST_ASSERT的使用实例
  5. ITK:打开一个二进制图像
  6. ITK:创建一个索引
  7. VTK:PolyData之ShrinkPolyData
  8. VTK:图表之RemoveIsolatedVertices
  9. C++虚析构和纯虚析构
  10. c++备忘录模式mememto