------JAVA中创建线程的的方式主要有三种:
1.继承Thread类创建线程类
(1)定义Tread类的子类,并重写该类的run方法,该run方法的方法体代表了线程要完成的任务,因此把run()方法称为执行体。
(2)创建Tread类的实例,即创建了线程对象。
(3)调用线程对象的start()方法来启动该线程。
实例:

package eureka.consumer.chenzheThread;public class ThreadTest extends Thread {int i = 0;//重写run方法public void run(){{for(;i<100;i++){System.out.println(getName()+" "+i);}}}public static void main(String[] args) {for(int i = 0;i < 100;i++){System.out.println(Thread.currentThread().getName()+" : "+i);if(i==20) {new ThreadTest().start();new ThreadTest().start();}}}
}

2.实现Runnable接口创建线程类
(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是 该线程的线程执行体。
(2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该 Thread对象才是真正的线程对象。
(3)调用线程对象的start()方法来启动该线程。
实例:

package eureka.consumer.chenzheThread;public class RunnableTest implements Runnable {private int i;@Overridepublic void run() {for(i = 0;i <100;i++){System.out.println(Thread.currentThread().getName()+" "+i);}}public static void main(String[] args){for(int i = 0;i < 100;i++){System.out.println(Thread.currentThread().getName()+" "+i);if(i==20){RunnableTest rtt = new RunnableTest();new Thread(rtt,"新线程1").start();new Thread(rtt,"新线程2").start();}}}}

3.通过Callable和Future创建线程
(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且 有返回值。
(2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对 象封装了该Callable对象的call()方法的返回值。
(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。
(4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
实例:

package eureka.consumer.chenzheThread;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class CallableTest implements Callable<Integer> {public static void main(String[] args){CallableTest ctt = new CallableTest();FutureTask<Integer> ft = new FutureTask<>(ctt);for(int i = 0;i < 100;i++){System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i);if(i==20){new Thread(ft,"有返回值的线程").start();}}try{System.out.println("子线程的返回值:"+ft.get());} catch (InterruptedException e){e.printStackTrace();} catch (ExecutionException e){e.printStackTrace();}}@Overridepublic Integer call() throws Exception {int i = 0;for(;i<100;i++){System.out.println(Thread.currentThread().getName()+" "+i);}return i;}
}

4.创建线程的三种方式的对比
------采用实现Runnable、Callable接口的方式创见多线程时,优势是:
线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。 在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同 一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面 向对象的思想。 劣势是: 编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。 使用继承Thread类的方式创建多线程时优势是: 编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this 即可获得当前线程。 劣势是: 线程类已经继承了Thread类,所以不能再继承其他父类。

程序员麦兜【编程笔记】-线程的概念及创建相关推荐

  1. 程序员面试宝典笔记1-基本概念预处理,const与sizeof

    程序员面试宝典笔记1-基本概念&预处理,const与sizeof 基本概念 赋值语句: i++: 类型转换 运算符问题 a,b交换与比较 其他 预处理 const sizeof 基本概念 赋值 ...

  2. 黑马程序员并发编程笔记(二)--java线程基本操作和理解

    3.java进程的基本操作 3.1.创建进程 方法一,直接使用 Thread // 构造方法的参数是给线程指定名字,,推荐给线程起个名字(用setName()也可以) Thread t1 = new ...

  3. 程序员的数学笔记3--迭代法

    第三节课程,介绍的是迭代法. 前两节笔记的文章: 程序员的数学笔记1–进制转换 程序员的数学笔记2–余数 03 迭代法 什么是迭代法 迭代法,简单来说,其实就是不断地用旧的变量值,递推计算新的变量值. ...

  4. 如何向新手程序员介绍编程?

     如何向新手程序员介绍编程? 学习Java,他们都说很easy. 作为一名刚从斯康星大学麦迪逊分校计算机科学系毕业的大学生,我通过一些编程课程认识了很多使用Java的朋友.现在很多学校都在从别的编 ...

  5. 程序员的数学笔记2--余数

    上一节程序员的数学笔记1–进制转换是介绍了进制,特别是十进制和二进制之间的转换,移位操作和逻辑操作. 今天介绍的是余数,看完本节笔记,你会发现生活中有很多东西都有余数的影子. 余数 余数的特性 整数是 ...

  6. C/C++程序员的编程修养

    关注.星标公众号,不错过精彩内容 作者:陈浩 转自:嵌入式云IOT技术圈 什么是好的程序员?是不是懂得很多技术细节?还是懂底层编程?还是编程速度比较快?我觉得都不是.对于一些技术细节来说和底层的技术, ...

  7. 论一个程序员的编程修养(你品,你细品)

    论一个程序员的编程修养 转自:陈浩 芯片之家 作者:陈浩 来源:嵌入式云IOT技术圈 什么是好的程序员?是不是懂得很多技术细节?还是懂底层编程?还是编程速度比较快?我觉得都不是.对于一些技术细节来说和 ...

  8. 黑马程序员Maven学习笔记

    前言 这里是黑马程序员Maven学习笔记分享,这是视频链接. 我还有其它前端内容的笔记,有需要可以查看. 文章目录 前言 基础 Maven简介 Maven是什么 Maven的作用 Maven的下载 M ...

  9. c++ 读陈黎娟的《C、C++实践进阶之道,写给程序员的编程书》所感--关于变量的类型与引用

    最近在看陈黎娟的书<C.C++实践进阶之道,写给程序员的编程书>,其中第十一章讲的是变量和类型,现做笔记如下: 数据存储区域分只读数据区(存储常量和恒值,正常情况下不做修改).全局/静态存 ...

  10. python好学吗 老程序员-使用 Python 会降低程序员的编程能力吗?

    某些情况下会降低编程能力,某些情况下会提升编程能力,要看你怎么理解"编程能力". 1.使用 Python 会降低程序员的编程能力,这个假设成立的情形 如果强行要说使用Python可 ...

最新文章

  1. mybatis对mapper.xml的解析(一)
  2. Oracle错误代码:ORA-28002导致密码消失
  3. php禁止代理ip访问_php禁止某ip或ip地址段访问的方法(转载)
  4. java遍历所有目录和文件
  5. Cesium专栏-卫星轨迹
  6. c语言实现1024点fft程序,C语言1024点快速傅里叶变换(FFT)程序,最好经过优化,执行速度快...
  7. 微信密文聊天新方法,很实用!
  8. 编译原理课程作业-Cminus语言的词法及语法分析器实现
  9. PHP设计模式——建造者模式
  10. Android自定义View【实战教程】5⃣️---Canvas详解及代码绘制安卓机器人
  11. An NVIDIA kernel module ‘nvidia-drm‘ appears to already be loaded in your kernel...
  12. 代码对比/归并/两个代码对比,对比代码
  13. C语言的数学运算函数
  14. 离散数学学习笔记——第七讲——特殊关系和函数(5.4 哈斯图和特殊元素)
  15. JS基礎:Hoisting 變量提升、TDZ 暫時性死區(Temporal Dead Zone)
  16. python中的颜色_Python学习第234课——html中的颜色值
  17. RVM怎么下载和管理ruby版本 - 猿码设计师 ruby rvm
  18. spring boot + vue 前后端下载文件文件
  19. SQL Server2000中执行一个SQL, 在lock上发现自己锁自己
  20. 2016 KCon 黑客大会兵器谱

热门文章

  1. POJ 1589 Unix ls
  2. 2022-2028年中国CDMO行业市场专项调研及投资前景研究报告
  3. 浅析字符串匹配算法——KMP算法(附CF 535D-Tavas and Malekas)
  4. python如何将日期字符串格式化年月日
  5. php中session时间,php中session过期时间的设置方法
  6. Linux入门级教学-常见指令及其权限理解
  7. 让服务具有不死之身的方法
  8. 2020年中国互联网之大事件(一)
  9. [Android APP] ios和android都领取不到的假口令红包app和源码
  10. 出现The import javax.servlet cannot be resolved 的解决方法