前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java多线程

java多线程

作者头像
全栈程序员站长
发布2022-07-06 12:43:00
4100
发布2022-07-06 12:43:00
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是全栈君。

概念

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

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

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

创建线程方式一

  • 继承Thread类 步骤: 1、定义类继承Thread 2、复写Thread类中的run方法 目的:把自己定义代码,放在run方法中,让线程运行。 3、调用线程中的start方法 start方法有两个作用。启动线程和调用run方法

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

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

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

代码语言:javascript
复制
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、必须多个线程使用同一个锁
  • 同步的优点 解决可多线程的安全问题
  • 同步的缺点 多个线程都须要推断锁,较为消耗性能

待续…

代码语言:javascript
复制
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);
        }

    }
}

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117056.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • 创建线程方式一
  • 获取线程的名称 和对象
  • 创建线程方式二
  • 多线程安全问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档