首页 > 其他分享 >多线程 p2

多线程 p2

时间:2024-04-09 21:59:23浏览次数:23  
标签:p2 Runnable Thread 线程 new 多线程 public

多线程概念

​ Java中的多线程概念指的是在java程序中同时执行多个进程的技术。Java提供了内置的多线程支持。Java的多线程编程可以用于实现并行计算、提升程序的响应性、处理异步任务等场景

JAVA线程实现/创建方式

1.继承Thread类

​ //继承Thread类,重写run()方法,调用start()开启线程

public class MyThread extends Thread { 

 public void run() { 

 System.out.println("MyThread.run()"); 

 } 

} 

MyThread myThread1 = new MyThread(); 

myThread1.start(); 

2.实现Runnable接口

​ 实现Runnable接口,重写run()方法,执行线程需要丢入runnable接口实现类,调用start()方法

​ 推荐使用实现Runnable接口方法:

1.因为java的单继承机制,如果已经继承了一个类就无法在 extends Thread了,此时就需要implement Runnable接口了

2.如果一个类extends Thread就不适合资源共享。但是如果implements Runnable的话,则很容易的实现资源共享

这里的资源共享指的是多个线程可以共同访问和操作同一份资源,比如类的成员变量、类的静态变量、方法等

相比之下,继承Thread类实现资源共享,首先继承 Thread类来创建线程,每个线程都有自己独立的实例变量和方法,需要使用静态变量或全局变量才能实现资源共享(会引入线程安全问题)

public class TestThread3 implements Runnable{
    @Override
    public void run() {
        // run()方法线程体
        for (int i = 0; i < 20; i++) {
            System.out.println("我在学习多线程"+i);
        }
    }
    public static void main(String[] args) {
        // 主线程
        // 主线程中启动多线程

        //创建runnable接口的实现类对象
/*        TestThread3 t1 = new TestThread3();
        //创建线程对象,通过线程对象来开启我们的线程。代理
        Thread thread = new Thread(t1);
        thread.start();*/
        //简写
        new Thread(new TestThread3()).start();

        for (int i = 0; i < 200; i++) {
            System.out.println("我在看书"+i);
        }
    }
}

说明:

​ TestThread3通过实现Runnable接口,使该类有了多线程的特征。所有的多线程执行代码都在run()方法里面。Thread类实际上也是实现了Runnable接口的类

在启动多线程的时候,实例的Thread对象需要通过Thread类的构造方法Thread(Runnable target)丢入一个runnable接口的实现类对象。然后在调用Thread类的start()方法来启动多线程

通过implements Runnable接口案例-购票系统

/**
 *      本节是关于创建线程的案例-购票
 *  总人数20人
 * */
public class TestThread4 implements Runnable{
    int ticketNum = 20;

    @Override
    public void run() {
        while (true){
            if (ticketNum <= 0){
                break;
            }
            System.out.println(Thread.currentThread().getName()  + "抢到了" + ticketNum -- + "票");
        }
    }
    public static void main(String[] args) {
        TestThread4 testThread4 = new TestThread4(); //实例化一个线程对象
        new Thread(testThread4,"张三").start();
        new Thread(testThread4,"李四").start();
        new Thread(testThread4,"王五").start();
    }
}

以上涉及到并发问题

并发:在操作系统中,是指一个时间段有几个程序处于已启动运行到运行完毕之间,且这几个程序在一个处理器上运行。

同一时间,只有一个处理器只能运行一条指令,但多个进程被快速的执行(同一个程序,同一时间运行两次,就是两个独立的进程),因为执行的速度很快,使得在宏观上有同时执行的效果,但在微观上并不是同时执行的,只是多个进程被快速的交替执行

此处补充一下并行。

并行:当有一个cpu数量以上,多个cpu同时执行多个进程,各个进程之间并不影响,决定并行的关键因素其实不是cpu的数量,而是cpu的核心数量,如果一个cpu有多核,也是可以并行的。

并发性更多与软件有关,它是通过操作系统的调度器(操作系统内部的一个重要组件,负责管理和控制系统中的进程或线程)来实现的,并行性更多的是与硬件的有关,它需要多个处理器或者多核处理器来实现

在实际应用中,通常会同时利用并发和并行来提高系统的性能和吞吐量

这里在给出一个龟兔赛跑的案例

巩固一下extends Thread 和implements Runnable之间的关系

Race类是一个实现Runnable接口的类。这意味着它可以被视为一个可运行的任务,通过创建的Thread实例将race传递给它,实际上是告诉Thread类执行race中的run方法

extends Thread创建线程,implements Runnable 定义线程要执行的任务这种方式实现了线程的创建和任务的执行的分离

/**
 *      本节实现龟兔赛跑案例
 *   赛道距离,离终点越来越近
 *   判断比赛是否结束
 *   打印出胜利者
 *   龟兔赛跑开始
 *   故事中是乌龟赢得比赛,兔子中途睡觉,模拟兔子睡觉
 *   最终乌龟赢得比赛
 * */
public class Race implements Runnable{
    //胜利者
    private static String winner;
    //比赛是否结束
    private boolean flag;

    @Override
    public void run() {
        for (int i = 100; i > 0; i--) {
            // 模拟兔子睡觉
            if(Thread.currentThread().getName().equals("兔子") && i % 10 == 0){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            flag = gameOver(i);
            if (flag){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"距离终点还有" + i + "步");
        }

    }
    //判断比赛是否结束
    private boolean gameOver(int steps){
        if(winner != null){//已有胜利者,返回true,结束其他线程的比赛
            return true;
        }
        if (steps == 1){
            winner = Thread.currentThread().getName();
            System.out.println(winner + "赢得了比赛");
            return true;//当前线程赢得比赛后,需要结束比赛
        }
        return false;
    }

    public static void main(String[] args) {
        System.out.println("-------龟兔赛跑开始--------");
        Race race = new Race(); //创建一个race对象,模拟一个赛道
        new Thread(race,"兔子").start();
        new Thread(race,"乌龟").start();// 创建两个线程,模拟乌龟和兔子
    }
}

标签:p2,Runnable,Thread,线程,new,多线程,public
From: https://blog.csdn.net/m0_64646374/article/details/137568130

相关文章

  • 《架构风清扬-Java面试系列第19讲》解释一下Java中的“volatile”在多线程环境中的作
    适用范围:这道题适应范围挺宽的,各个年限都可以用参考答案:主要用于确保变量在多个线程之间的可见性和有序性。可见性:当一个线程修改了被volatile修饰的变量,其他线程能够立即看到修改后的值。这确保了变量在多个线程之间的可见性。有序性:volatile关键字能够防止指令重排序......
  • 多线程
    多线程一、多线程理论[1]什么线程在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程线程顾名思义,就是一条流水线工作的过程一条流水线必须属于一个车间,一个车间的工作过程是一个进程车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一个流水线......
  • Java基础知识-面向对象编程(OOP)-Java集合框架-多线程和并发-Spring框架
    Java基础知识:Java的四种基本数据类型是:byte、short、int、long(整数类型)、float、double(浮点类型)、char(字符类型)、boolean(布尔类型)。它们之间的区别主要在于占用的内存大小和表示范围不同。Java中的String是不可变的意味着一旦String对象被创建,它的值就不能被修改。这意味着St......
  • 简述多线程中的锁与sleep
    面试中经常被问到,在多线程/加锁环境下使用sleep可能出现的问题,首先总结一下这些问题基本都出自sleep不会释放锁这一点(与wait()截然相反)。1sleep可能会引发的问题线程持有锁时休眠:当一个线程在持有锁的情况下调用sleep()时,它会在睡眠时仍保持锁的状态,此时其他线程将无法访......
  • 洛谷题单指南-数学基础问题-P2638 安全系统
    原题链接:https://www.luogu.com.cn/problem/P2638题意解读:把a个红球、b个黑球放入n个盒子,求所有的方法。解题思路:盒子中可以放也可以不放,可以放任意个,因此,题目可以转化为将i个红球(0<=i<=a),j个黑球(0<=j<=b)放入n个盒子的方案数之和,设f(n,i,j)表示将一个红球、j个黑球放入n......
  • 数码管显示屏驱动芯片VK1640 SOP28,2线串行接口,适用于小型LED显示屏驱动
    产品品牌:永嘉微电/VINKA产品型号:VK1640封装形式:SOP28概述VK1640是一种数码管或点阵LED驱动控制专用芯片,内部集成有数据锁存器、LED驱动等电路。SEG脚接LED阳极,GRID脚接LED阴极,可支持8SEGx16GRID的点阵LED显示。适用于小型LED显示屏驱动。采用SOP28的封装形式。LJQ336特点•......
  • TLP281 光电耦合器
    TLP281规格信息:制造商:Toshiba产品种类:晶体管输出光电耦合器RoHS:是商标:Toshiba输出类型:NPNPhototransistor通道数量:1Channel绝缘电压:2500Vrms最大集电极/发射极电压:80V最大集电极/发射极饱和电压:0.2VIf-正向电流:50mAVf-正向电压:1.3VVr-反......
  • 多线程面试要点
    一、线程的基础知识1、线程和进程的区别一个线程就是一个指令流,将指令流中的一条条指令以一定顺序交给CPU执行一个进程之内可以分为一到多个线程。二者对比进程是正在运行程序的实例,进程中包含了线程,每个线程执行不同的任务。不同的进程使用不同的内存空间,在当前进程......
  • C++ [NOIP2009 普及组] 分数线划定
    文章目录一、题目描述[NOIP2009普及组]分数线划定题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示二、参考代码一、题目描述[NOIP2009普及组]分数线划定题目描述世博会志愿者的选拔工作正在A市如火如荼的进行。为了选拔最合适的人才,A市对所......
  • 动态规划和层次遍历 —— [NOIP2002 普及组] 过河卒
    题目如下:[NOIP2002普及组]过河卒题目描述棋盘上AAA点有一个过河卒,需要走到目标BB......