带你快速搞定java多线程

 更新时间:2021年07月14日 11:37:17   作者:香菜聊游戏  
这篇文章主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下

1、什么是线程

线程是操作系统调度的最小单元,也叫轻量级进程。它被包含在进程之中,是进程中的实际运作单位。同一进程可以创建多个线程,每个进程都有自己独立的一块内存空间。并且能够访问共享的内存变量。

2、线程的状态

线程的状态一般看到的也就是Runable 和blocked ,最多的还是blocked,因为cpu的时间片很短,切换的很快等待IO,等待临界资源。大概知道就好

图片

3、怎么通俗理解进程,线程?

举个例子,开了一家餐厅,餐厅这个实体就是进程,餐厅里的服务员就是线程,餐厅里的座位就是资源(游戏内的数据),所有的服务员都可以安排客人就座,多个服务员安排座位就是多线程竞争,锁也就是去排号。线程池就是有多个服务员一直站在那里等着被呼叫。

图片

4、线程和进程的区别

进程它是具有独立地址空间的,优点就是隔离度好,稳定,因为它是操作系统管理的,进程和进程之间是逻辑隔离的,只要操作系统不出问题的话,一个进程的错误一般不会影响到其它进程,缺点就是信息资源共享麻烦。而线程只是进程启动的执行单元,它是共享进程资源的,创建销毁、切换简单,速度很快,占用内存少,CPU利用率高。但是需要程序员管控的东西也比较多,相互影响出问题的机率较大,一个线程挂掉将导致整个进程挂掉,所以从程序员的角度来讲,我们只能看到某种代码是线程安全的,而没有说进程安全的。

5、什么是线程安全

在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。

图片

类比:在餐厅里,每个服务员都有一份自己排号,比如我刚刚安排了一个人去坐在8号座,那我想当然的以为是下一个是9号座,如果另外一个服务员同时安排了9号桌,我再去安排就会造成数据不安全了,出现问题了。

6、如何创建线程

java创建线程的三种方式:

  • 继承Thread类创建线程类,无法继承其他类。
  • 实现Runnable接口
  • 通过Callable和Future创建线程
package thread;
/**
 * @author 香菜
 */
public class ExtendThread extends Thread {
    @Override
    public void run() {
        System.out.println("ExtendThread");;
    }
}
package thread;
import java.util.concurrent.Callable;
/**
 * @author 香菜
 */
public class ImpCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        System.out.println("Callable ");
        return 1;
    }
}
package thread;
/**
 * @author 香菜
 */
public class ImpRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Runnable");
    }
}
package thread;
import java.util.concurrent.FutureTask;
/**
 * @author 香菜
 */
public class Aain {
    public static void main(String[] args) {
        new ExtendThread().start();
        new Thread(new ImpRunnable()).start();
        new Thread(new FutureTask<>(new ImpCallable())).start();
    }
}

总结:

线程的概念来自于生活,理解了概念,在项目中思考的时候只要搞清楚项目的线程模型,基本上不会遇到太大的问题。

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Java全面解析XML格式串(JDOM解析)

    Java全面解析XML格式串(JDOM解析)

    下面小编就为大家带来一篇Java全面解析XML格式串(JDOM解析)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • java中Scanner.next()和Scanner.nextLine的区别图文详解

    java中Scanner.next()和Scanner.nextLine的区别图文详解

    使用java语言编程,最常用的输入就是使用Scanner了,它的构造很简单,这篇文章主要给大家介绍了关于java中Scanner.next()和Scanner.nextLine区别的相关资料,需要的朋友可以参考下
    2024-02-02
  • 深度解析Java中ArrayList的使用

    深度解析Java中ArrayList的使用

    ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。本文将通过示例带你深度解析Java中ArrayList的使用,需要的可以参考一下
    2022-09-09
  • Java实现九九乘法表的小例子

    Java实现九九乘法表的小例子

    九九乘法表一般为三角形,每个数分别和从1到自身的数相乘然后把结果列出来,即要用到两层循环,外层是从1到9for(i=1;i<=9;i++),内层是当前数和从1到自身相乘for(j=1;j<=i;j++)
    2013-09-09
  • java虚拟机JVM类加载机制原理(面试必问)

    java虚拟机JVM类加载机制原理(面试必问)

    这篇文章主要介绍了面试当中必会问到的java虚拟机JVM类加载机制,非常的详细,有需要的朋友可以借鉴参考下,欢迎多多交流讨论
    2021-08-08
  • Mybatis动态SQL的示例代码

    Mybatis动态SQL的示例代码

    本文主要介绍了Mybatis动态SQL的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Java 中ThreadLocal类详解

    Java 中ThreadLocal类详解

    什么是ThreadLocal?顾名思义它是local variable(线程局部变量)。它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。
    2016-03-03
  • 浅析java中ArrayList与Vector的区别以及HashMap与Hashtable的区别

    浅析java中ArrayList与Vector的区别以及HashMap与Hashtable的区别

    以下是对java中ArrayList与Vector的区别以及HashMap与Hashtable的区别进行了详细的解析。需要的朋友可以过来参考下
    2013-08-08
  • Java的深拷贝与浅拷贝的几种实现方式

    Java的深拷贝与浅拷贝的几种实现方式

    这篇文章主要介绍了Java的深拷贝与浅拷贝的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java实现“年-月-日 上午/下午时:分:秒”的简单代码

    Java实现“年-月-日 上午/下午时:分:秒”的简单代码

    当前的日期输出的方法有很多,本文为大家介绍下在java中是如何实现“年-月-日 上午/下午时:分:秒”,感兴趣的朋友不妨参考下
    2015-08-08

最新评论