首先理清几个基本概念:

  程序:为完成特定任务,用某种语言编写的一组指令的集合。即一段静态的代码(还没运行起来)

  进程:是程序的一次执行过程,也就是说程序运行起来了,加载到了内存中,并占用了cpu的资源。这是一个动态的过程:有自身的产生、存在和消亡的过程,这也是进程的生命周期。

  线程:进程可进一步细化为线程,是一个程序内部的执行路径。

  若一个进程同一时间并行执行多个线程,那么这个进程就是支持多线程的。

  线程是cpu调度和执行的单位,每个线程拥有独立的运行栈和程序计数器(pc),线程切换的开销小。

  多线程:是指程序当中包含多个执行单元,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个线程创建多个并行执行的线程来完成各自的任务。

  Java线程的分类:用户线程和守护线程

  java的gc()垃圾回收线程就是一个守护线程

  守护线程是用来服务用户线程的,通过start()方法前调用thread.serDaemon(True)可以把一个用户线程变成守护线程

  并行和并发

    并行:多个cpu同时执行多个任务

    并发:一个cpu同时执行多个任务

  多线程的优点

    提高应用程序的相应。

    提高计算机cpu的利用率

    改成程序结构。将复杂的进程分成多个线程,独立运行。

线程的创建与启动

  多线程实现的原理

    java的jvm允许程序运行多个线程,多线程可以通过Java中的java.lang.Thread类来体现

  Thread类的特性

    每个线程都是通过每个特定的Thread对象的run()方法来完成操作,经常把run()方法的主体称为线程体

    通过Thread方法的start()方法来启动这个线程,而非调用run()

  多线程的创建,方式一:继承于Thread类

    1.创建一个继承于Thread类的子类

    2.重写Thread类的run()方法

    3.创建Thread类的子类的对象()

    4.通过此对象调用start()来启动一个线程

 代码实现:多线程执行同一段代码

package com.Thread.demo1;

public class demo1 extends Thread{
@Override
public void run(){
for(int i = 0;i<100;i++){
if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ":\t" + i);
}
}
}
public static void main(String[] args){
demo1 test1 = new demo1();
test1.start();
demo1 test2 = new demo1();
test2.start(); new demo1().start();
System.out.println("主线程");
}
}

  多线程运行多代码:

  currentThread()可以获取当前线程的引用,一般都是在没有线程对象又需要获得线程信息时通过           Thread.currentThread()获取当前代码段所在线程的引用。

public class demo2 {
public static void main(String[] args){
new Threadtest1().start();
new Threadtest2().start();
}
}
class Threadtest1 extends Thread{
@Override
public void run(){
for(int i = 0;i<100;i++){
if(i%2==0){
System.out.println(Thread.currentThread() + ":\t" + i);
}
}
}
}
class Threadtest2 extends Thread{
@Override
public void run(){
for(int i = 0;i<100;i++){
if(i % 2 !=0){
System.out.println(Thread.currentThread() + ":\t" + i);
}
}
}
}

运行结果:

  多线程的创建方式二:实现runnable接口

    1.创建一个实现runnable接口的类

    2.实现类去实现runnable接口中的抽象方法:run()

    3.创建实现类的对象

    4.将此对象作为参数传到Thread类的构造器中,创建Thread类的对象

    5.通过Thread类的对象调用start()方法

public class demo3 {
public static void main(String[] args){
RunnableTest runnableTest = new RunnableTest();
Thread t1 = new Thread(runnableTest);
t1.start();
Thread t2 = new Thread(runnableTest);
t2.start();
}
}
class RunnableTest implements Runnable{
@Override
public void run(){
for(int i = 0;i < 100;i++){
if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getId() + ":\t" + i);
}
}
}
}

比较创建线程的两种方式

  Java中只允许单进程,以children类来说,这个类如果存在父类(Person)的话,就不可以继承Thread类了,但是一个类可以实现多个接口,因此实现的方式没有类的单继承性的限制,用实现runnable接口的方式创建此类线程将更加实用!

  实现runnable接口的方式天然具有共享数据的特性(不用static)

  • 因为继承Thread的实现方式,需要创建多个子类的对象来进行多线程,如果子类中有变量A,而不使用static约束变量的话,每个子类的对象都会有自己独立的变量A,只有static约束A后,子类的对象才共享变量A。而实现Runnable接口的方式,只需要创建一个实现类的对象,要将这个对象传入Thread类并创建多个Thread类的对象来完成多线程,而这多个Thread类对象实际上就是调用一个实现类对象而已。实现的方式更适合来处理多个线程有共享数据的情况。

联系:Thread类中也实现了Runnable接口

相同点两种方式都需要重写run()方法,线程的执行逻辑都在run()方法中

  多线程的创建方式,方式三:实现Callable接口

    1.相比run()方法,可以有返回值

    2.方法可以抛出异常

    3.支持泛型的返回值

    4.需要借助FutureTask类,比如获取返回结果

public class demo4 {
public static void main(String[] args){
NumSum numSum = new NumSum();
FutureTask<Integer> future = new FutureTask<Integer>(numSum);
new Thread(future).start();
try{
Integer sum = future.get();
System.out.println("总和为:" + sum); }catch (InterruptedException e){
e.printStackTrace();
}catch (ExecutionException e){
e.printStackTrace();
} }
} class NumSum implements Callable<Integer>{
@Override
public Integer call() throws Exception{
int sum = 0;
for (int i = 0;i<100;i++){
if(i%2==0){
sum+=i;
}
}
return sum;
}
}

Thread类中的常用方法

  start()启动当前线程,调用当前线程的run()方法

  run()通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中

  currentThread()静态方法,返回当前代码执行的线程

  getName()获取当前线程的名字

  serName()设置当前线程的名字

  yield()释放当前cpu的执行权

  join()在线程a中调用线程b的join(), 此时线程a进入阻塞状态, 知道线程b完全执行完以后, 线程a才结束阻塞状态

  stop()已过时,当执行此方法,强制结束当前线程

  sleep(long miltime)让线程睡眠指定的毫秒数,在指定时间内,线城市阻塞状态

  isAlive()判断当前线程是否存活

Java中的多线程的创建方式的更多相关文章

  1. 牛客网Java刷题知识点之什么是进程、什么是线程、什么是多线程、多线程的好处和弊端、多线程的创建方式、JVM中的多线程解析、多线程运行图解

    不多说,直接上干货! 什么是进程? 正在进行中的程序(直译). 什么是线程? 就是进程中一个负责程序执行的控制单元(执行路径). 见 牛客网Java刷题知识点之进程和线程的区别 什么是多线程? 一个进 ...

  2. java中的多线程

    什么是多线程? 首先得知道什么是线程? 线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务. ...

  3. 【转】Java中的多线程学习大总结

    多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...

  4. Java中的 多线程编程

    Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...

  5. java中的多线程 // 基础

    java 中的多线程 简介 进程 : 指正在运行的程序,并具有一定的独立能力,即 当硬盘中的程序进入到内存中运行时,就变成了一个进程 线程 : 是进程中的一个执行单元,负责当前程序的执行.线程就是CP ...

  6. Java中的多线程技术全面详解

    本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...

  7. 详细分析 Java 中实现多线程的方法有几种?(从本质上出发)

    详细分析 Java 中实现多线程的方法有几种?(从本质上出发) 正确的说法(从本质上出发) 实现多线程的官方正确方法: 2 种. Oracle 官网的文档说明 方法小结 方法一: 实现 Runnabl ...

  8. Java中创建对象的几种方式

    Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...

  9. Java 中传统多线程

    目录 Java 中传统多线程 线程初识 线程的概念 实现线程 线程的生命周期 常用API 线程同步 多线程共享数据的问题 线程同步及实现机制 线程间通讯 线程间通讯模型 线程中通讯的实现 @(目录) ...

随机推荐

  1. Java语言的跨平台性

    2.1 Java虚拟机 -- JVM JVM:Java虚拟机,简称JVM,是运行所有java程序的假想计算机,是java程序的运行环境,是java最具吸引力的特性之一,我们编写的java代码都运行在J ...

  2. python 操作pdf文档

    简介 在实际项目中,我们有可能需要提取当中的部分内容并导出,给PDF文件添加水印,合并多份PDF文件等等,而本文会着重用到PyPDF2模块来玩转PDF文档,以及tabula模块来对PDF文档中的表格数 ...

  3. Mybatis的使用(3)

    1:动态sql: 意义:可以定义代码片段,可以进行逻辑判断,可以进行循环或批量处理,使条件判断更为简单 1.1:定义代码片段简化代码: 1.2:多条件查询: <where> <if ...

  4. 机器学习(公式推导与代码实现)--sklearn机器学习库

    一.scikit-learn概述 1.sklearn模型   sklearn全称是scikit-learn,它是一个基于Python的机器学习类库,主要建立在NumPy.Pandas.SciPy和Ma ...

  5. 【web自动化测试】Playwright快速入门,5分钟上手

    我喜欢Playwright! 这是微软开源的一款非常强大的自动化工具,再过几年,他很有可能取代Selenium在浏览器自动化的通知地位.使用过一段时间,我没有找到很好的中文资料可以参考,导致很多问题无 ...

  6. MySQL:关于MGR中监控的两个重要指标简析

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 转载声明:以下文章来源于MySQL学习 ,作者八怪(高鹏) 一.两个重要的指标 ...

  7. Dynamic CRM一对多关系的数据删除时设置自动删除关联的数据

    在业务实体中主子表非常常见,然后子表可能有会有自己的子表或者多对多关系,在删除的业务场景下,删除主数据,剩余的子数据就成了脏数据, 之前的做法是,监听主表的删除事件,然后在插件中找到其下的子表数据然后 ...

  8. 根节点选择器和 html 选择器

    CSS 中除了用标签选择器选中<html>标签以外还有一个等价的是:root选择器.CSS 变量是有作用域的,全局变量都可以声明在<html>里. <div class= ...

  9. 搭建 Webpack 项目步骤

    前言 Node.js 就像是 Java 的虚拟机 + JDK,可以让 js 脱离浏览器沙盒,且提供模块机制.I/O 操作.数据库操作.网络操作等.Node.js 又提供了大量的库,NPM(类似于 Ma ...

  10. (最简单详细)IronPython下载、安装及简单使用

    说实话,对于我这种小白,在网上找个IronPython找的很费劲,学会操作之后,直接整个随笔,供新手参考.前提是现在你应该有VS了 (1)找到IronPython的网站 很多人肯定就按照习惯搜索,Ir ...