Java多线程编程复习总结(一)

Java中多线程概述

一、基本概念

进程和线程

  1. 进程是程序运行的实例,比如Java程序就是一个Java虚拟机进程
  2. 每个进程中可以包含多个线程,每个线程完成各自不同的任务,在Java平台中一个线程对应一个对象

    但是这个对象和普通类中声明的对象不一样,不是分配在对空间中的;而是,JVM会给每个线程分配一个栈空间,这个和普通对象还是有区别的

Java中线程的使用

  1. 继承Thread类,重写run()方法(线程实现人任务的入口);主方法中实例化子类后使用start()启用
  2. 实现Runnable接口,主方法中实例化实现类,该实例 作为Thread类构造参数实例化,调用start()方法启用

    可以使用同一个Runnable实例作为参数构造多个线程,实现数据共享

Java中线程具体体现

  1. Java进程运行,Java虚拟机启动的时候会创建一个main线程,执行Java程序入口方法,即main方法

    并不是main方法是线程,它只是主函数线程栈中的一个栈帧,也就是说Java程序运行中有一个线程是负责执行主方法的。

  2. start()方法启动线程,调度是由Java虚拟机调度的,线程的run()方法执行结束时,这个线程也就结束了;start()方法只能调用一次,不能重复调用,会报错
  3. Java中任何一段代码都是被某一个线程所执行(所有线程都是执行main函数的主线程创建的,可以嵌套),通过static Thread currentThread()静态方法查看当前代码段被哪个线程所执行

    同时,一段代码可以被多个线程执行,比如实现Runnable方法创建线程时,使用同一个Runnable实例就是这种效果

Java中Thread类

  1. 常用属性:tid,name,daemon,priority
  2. 常用方法:
    public static native Thread currentThread();
    public void run()
    void start()
    void join()//A调用B.join(),即当B执行完,才会执行A线程任务
    static void yield()
    static void sleep(long millis)
    

线程的状态和调度

  1. 6种状态
    在这里插入图片描述
  2. Java种多个线程抢占式调度,就会造成竞态(结果的正确与否和时间有关)和上下文切换。

二、多线程使用中的安全性

  1. 因为共享变量的存在导致运行结果可能出现不同的情况
  2. 产生竞争状态的几种情况:
    • 多个线程对临界区进行读+改+写,会导致脏读或者丢失修改(一个线程读了另一个线程写之前的,或者两者同时写一个变量等)

    • 多个线程判断+执行,其中判断条件的更改无法同步导致的错误执行

      public class RaceState {
          public static void main(String[] args) throws InterruptedException {
              ThreadTask threadTask = new ThreadTask();
              Thread thread1 = new Thread(threadTask);
              Thread thread2 = new Thread(threadTask);
              Thread thread3 = new Thread(threadTask);
              Thread thread4 = new Thread(threadTask);
      
              thread1.start();
              //Thread.currentThread().sleep(1000);
              thread2.start();
              thread3.start();
              thread4.start();
      
          }
          static class ThreadTask implements Runnable{
              private int count = 0;
      
              @Override
              public void run() {
                  do{
                      count++;
                      showCount();
                  }while (count < 100);
      
              }
              private void showCount(){
                  System.out.println(Thread.currentThread().getName() + ":" + count);
              }
          }
      }
      

      在这里插入图片描述

      可以看出 两个线程出现了冲突

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值