多线程 p2

多线程概念

​ 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();// 创建两个线程,模拟乌龟和兔子
    }
}
  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值