前言

这篇文章主要讲述线程的概念、组成、Java创建多线程的三种方式以及线程的类型。

线程概念

线程和进程的区别

**进程:**正在运行的程序,例如:你打开 的qq音乐.exe程序,其由PCB(进程控制块)、栈、程序、数据组成。

线程:是一个进程中的程序代码的一个执行序列,被认为是带有自己的程序代码和数据的虚拟处理机的封装,其由处理机、代码、数据三部分组成,你可以这样理解线程是在进程内部同时做的事情,比如你在qq音乐应用里可以一边听音乐、同时下载音乐。这就是由多线程来实现的。(一个进程至少包含一个或者多个线程)

注意:

每个Java程序都有一个隐含的主线程,即main()方法,要实现多线程必须在主线程中创建新的线程,Java语言使用Thread类及其子类的对象来表示线程;

一个虚拟处理机封装在java.lang.Thread类中,它控制着整个线程的运行;CPU执行的代码传递给Thread类,由Thread类控制顺序执行;处理的数据传递给Thread类,是在代码执行的过程中所要处理的数据。代码和数据可以由多个线程共享,也可以不被共享,代码和数据是相互独立的,当两个线程共享同一个类的实例时,他们就共享相同的代码;当两个线程共享一个公共对象的存取时,他们就共享相同的数据。

线程的生命周期

一个线程从它被创建到停止执行要经历一个完整的生命周期,在这个生命周期中有4种不同的状态。

①New(新) ②Runnable(可运行) ③Blocked(被阻塞) ④Dead(死亡)

创建线程的三种方式

通过继承Thread类

package thread;

public class ThreadTest extends Thread{

String threadName;

public ThreadTest1(String s){

System.out.println("Making thread:"+s);

threadName = s;

}

public void run(){

for( int i = 0; i < 3; i++ ){

System.out.println("Running thread number =" + threadName);

try {

Thread.sleep(1000); //线程睡眠1秒

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//主线程,操作系统调度每个线程执行

public static void main(String[] args){

ThreadTest1 thread1 = new ThreadTest1("Tom"); //线程1Tom

ThreadTest1 thread2 = new ThreadTest1("Jack"); //线程2Jack

/**线程启动,不是直接调用 run() 方法,而是调运线程类 Thread 的 start() 方法,

*在 Thread 方法内部会调用本地系统方法,最终会自动调用自己线程类的 run()方法。

**/

thread1.start();

thread2.start();

System.out.println("End of main");

}

}

运行截图

通过实现Runnable接口

package thread;

public class ThreadTest implements Runnable{

String threadName;

public ThreadTest(String s){

System.out.println("Making thread:"+s);

threadName = s;

}

public void run(){

for( int i = 0; i < 3; i++ ){

System.out.println("Running thread number =" + threadName);

try {

Thread.sleep(1000); //让线程睡眠1秒

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//主线程,操作系统调度每个线程执行

public static void main(String[] args){

//创建线程Tom和线程Jack

Thread thread1 = new Thread(new ThreadTest("Tom"));

Thread thread2 = new Thread(new ThreadTest("Jack"));

/**线程启动,不是直接调用 run() 方法,而是调运线程类 Thread 的 start() 方法,

*在 Thread 方法内部会调用本地系统方法,最终会自动调用自己线程类的 run()方法。

**/

thread1.start();

thread2.start();

System.out.println("End of main");

}

}

运行截图

通过实现Callable接口

package thread;

import java.util.concurrent.Callable;

import java.util.concurrent.FutureTask;

public class ThreadTest implements Callable{

String threadName;

public ThreadTest(String s) {

System.out.println("Making thread:"+s);

threadName = s;

}

@Override

public Integer call() throws Exception {

int sum = 0;

// TODO Auto-generated method stub

for( int i = 0; i < 5; i++ ){

System.out.println(threadName+i);

sum += i;

}

return sum;

}

public static void main(String args[]){

//创建两个线程,并且启动

ThreadTest threadTest1 = new ThreadTest("Tom");

ThreadTest threadTest2 = new ThreadTest("Jack");

FutureTask result1 = new FutureTask<>(threadTest1);

new Thread(result1).start();

FutureTask result2 = new FutureTask<>(threadTest2);

new Thread(result2).start();

}

}

运行截图

线程类型分类

java中线程一共有两种类型,守护线程和用户线程,用户线程又叫非守护线程。

守护线程

可以通过thread.setDaemon(true)方法设置线程是否为守护线程,thread.setDaemon(true)必须在thread.start()之前设置,否则会抛出IllegalThreadStateException异常。在守护线程中开启的新线程也是守护线程。守护线程顾名思义是用来守护的,是给所有的非守护线程提供服务的,所以在JVM执行完所有的非守护线程后,JVM就会停止,守护线程也不在运行,最典型的守护线程就是java的垃圾回收机制(GC)。

非守护线程

java线程默认设置为非守护线程thread.setDaemon(false)。当主线程运行完之后,只要主线程里有非守护线程JVM就互惠退出,直到所有的非守护线程执行完之后JVM才会退出。、

> 总结:如果把一个线程设置成守护线程,则JVM的退出就不会关心当前线程的执行状态。

java多线程w3c_Java创建多线程的三种方式相关推荐

  1. java的如何创建js_[Java教程]JS创建事件的三种方式(实例)

    [Java教程]JS创建事件的三种方式(实例) 0 2016-05-11 14:00:16 1.普通的定义方式 οnclick="Sfont=prompt('请在文本框中输入红色','红色' ...

  2. java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)

    1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...

  3. Java 并发 多线程:创建线程的四种方式

    Java 并发 多线程: 创建线程的四种方式 继承 Thread 类并重写 run 方法 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式创建 1. 通过继承 Thread ...

  4. java 创建线程_【80期】说出Java创建线程的三种方式及对比

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...

  5. Java创建线程的三种方式

    一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...

  6. java bean 工厂模式_Spring框架通过工厂创建Bean的三种方式实现

    工厂模式 Spring中bean的创建,默认是框架利用反射new出来的bean实例.有时候也会有一些复杂的情况. 假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有Dri ...

  7. java 创建数组的三种方式及区别

    创建数组的三种方式:其实分为2类,一种是静态的创建,如方式一.一种是动态的创建,只不过根据写法的不同分为方式二和方式三: // 数组初始化的三种方式//1.声明,分配空间并赋值int[] arr0 = ...

  8. 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)

    读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...

  9. 把对象的创建交给spring来管理——  1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期

    把对象的创建交给spring来管理 spring对bean的管理细节     1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期 创建Bean的三种方式 ...

最新文章

  1. win10 VMware15 安装 CentOS6.4 64位(慢慢弄吧,别急)
  2. python百题百练 二级题目_计算机二级有必要考吗
  3. Intellij Idea2016.3 svn服务器拉取代码
  4. 12_02_Linux软件管理之二rpm
  5. K8s-V1.17.6支持GPU
  6. Django基础必备三件套: HttpResponse render redirect
  7. android webview file,Android WebView 不支持 H5 input type=file 解决方法
  8. Zookeeper C API 基本常量和结构体介绍
  9. 怎么分析linux的内核程序,Linux内核分析(供参考)
  10. 数学竖式排版中不为人知的技巧
  11. 研磨设计模式--外观模式
  12. 阿拉伯数字转换大写例如:120转一百二十
  13. 乌龟Git误点跳过工作树的解决方法
  14. python使用什么来体现代码之间的逻辑关系,Python使用缩进来体现代码之间的逻辑关系。...
  15. r610服务器维修,戴尔服务器R610
  16. DES算法的介绍和实现(转的,其实3des一样的原理就是加密解密加密而已)
  17. python 多因素方差分析_多因素方差分析估计平方和的三种方法
  18. ipad出现support.apple.com
  19. 北大张铭教授:基于知识图谱的机器学习
  20. 计算机学术英语演讲,学术英语写作与演讲

热门文章

  1. Redis 难题突破,最经典 46 题含详细解析
  2. 手把手教你搭建 Git 服务器
  3. Ubuntu 安装 Etcd
  4. 第五周周记(国庆第四天)
  5. dataframe 拆分 分裂
  6. dataframe 转json
  7. 自动驾驶与汽车安全电子技术
  8. 服务器技术综述(一)
  9. 摄像头ISP系统原理(上)
  10. AlexeyAB DarkNet YOLOv3框架解析与应用实践(三)