• java多线程


    概念

    流程:一个正常的程序运行。
    每个程序都有一个运行顺序。这个序列是一个运行路径,或致电控制单元。

    程: 就是进程中的一个独立的控制单元,线程在控制着进程的运行。

    一个进程中至少有一个线程。或者说至少一个控制单元。
    样例:jvm启动不止一个线程,还有负责垃圾回收的线程。

    创建线程方式一

    • 继承Thread类
      步骤:
      1、定义类继承Thread
      2、复写Thread类中的run方法
      目的:把自己定义代码,放在run方法中,让线程运行。


      3、调用线程中的start方法
      start方法有两个作用。启动线程和调用run方法

    通过运行这样的方法的运行结果的每次都不一样,由于多个线程获取CPU的运行权,CPU运行到谁。谁就运行。
    也就是说,在某一个时刻,仅仅能有一个程序运行(多核CPU除外),CPU做着高速的切换。以达到看上去是同一时候运行的效果。


    我们能够形象的把多线程的运行是互相争夺CPU的运行权。

    多线程的一个特性:随机性

    package com.vobile;
    
    class Test extends Thread {
        public void run(){
            for (int j = 0; j < 20; j++){
                System.out.println("j = " + j + "-------------");
            }       
        }
    }
    
    class ThreadDemo1{
        public static void main(String[] args){
            Test test = new Test(); //创建一个线程
    
            test.start();
    
            for(int i = 0; i<20; i++){
                System.out.println("i= " + i + "+++++++++++++++++");
            }
    
        }
    }
    
    //运行结果
    i= 0+++++++++++++++++
    i= 1+++++++++++++++++
    j = 0-------------
    i= 2+++++++++++++++++
    j = 1-------------
    i= 3+++++++++++++++++
    j = 2-------------
    i= 4+++++++++++++++++
    j = 3-------------
    i= 5+++++++++++++++++
    j = 4-------------
    ……

    获取线程的名称 和对象

    • 名称
      线程都有自己默认的名称
      线程的名字为:thread-编号 编号从0開始
      获取名称:getName()
      设置名称:setName(); 或者构造函数的方式进行名称设置
    • 获取对象
      static Thread currentThread();方法

    创建线程方式二

    • 实现Runnable接口
      1、子类覆盖接口中的run方法。


      2、通过Thread类创建线程,并将实现了Runnable接口的子类对象作为參数传递给Thread类的构造函数。


      3、Thread类对象调用start方法开启线程。

    多线程安全问题

    • 比如:买票问题,出现了不该出现的票
    • 问题原因:
      当多条语句在操作同一个线程的共享数据时,一个线程对多条语句仅仅运行了一部分,还没有运行完成,而还有一个线程參与进来运行,导致共享数据错误。
    • 解决的方法
      对多条操作共享数据的语句。仅仅能让一个线程运行完,在运行过程中,其它线程不能够參与运行。


      对象如同锁。持有锁的线程能够在同步中运行。没有锁的线程,即使获得CPU的运行权,也进不去。

      由于没有获取锁。

    • 同步的前提
      1、必须使用2个或以上的线程
      2、必须多个线程使用同一个锁

    • 同步的优点
      解决可多线程的安全问题

    • 同步的缺点
      多个线程都须要推断锁,较为消耗性能

    待续…

    package com.vobile;
    
    /**
     * 三个线程交替运行
     * */
    class Test extends Thread {
        private String name;
        public Test(String name){
            this.name = name;
        }
    
        public void run(){
            for (int j = 0; j < 20; j++){
                System.out.println(this.name + " test run... " + j);
            }       
        }
    }
    
    class ThreadDemo1{
        public static void main(String[] args){
            Test test1 = new Test("one"); //创建一个线程
            Test test2 = new Test("two");
    
            test1.start();
            test2.start();
            for(int i = 0; i<20; i++){
                System.out.println("main ... " + i);
            }
    
        }
    }

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Codeforces Round #226 (Div. 2)
    内存管理
    C/C++ 函数
    Codeforces Round #225 (Div. 2)
    常用链表操作总结
    Codeforces Round #224 (Div. 2)
    Codeforces Round #223 (Div. 2)
    Codeforces Round #222 (Div. 2)
    -树-专题
    Codeforces Round #221 (Div. 2)
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4805312.html
Copyright © 2020-2023  润新知