首页 > 编程语言 >java :多线程实现的三种方式

java :多线程实现的三种方式

时间:2022-11-10 11:24:38浏览次数:32  
标签:java name Thread start 三种 new 多线程 public String

一、并行、串行、并发

在了解java中多线程的三种实现方式之前,我们首先需要明白并行、串行、并发三个概念。

1.并行:多个CPU同时处理多个任务;

2.串行:单个CPU处理多个任务,当一个任务执行完成之后下一个任务才能够执行;

3.并发:单个CPU处理多个任务,每个任务都会被分一定的时间片,一个任务执行一段时间无论完成与否都要切换另一个任务执行。

在java中多线程其实就是并发的一种模式。

二、java实现多线程的三种方式

我们以买咖啡为例,现在咖啡店只有一个窗口,将每一个人买咖啡的过程视为一个任务。

1.实现Runnable接口

package multithreading;

public class LRunnableOne {

    public static void buyCoffee(String name) {
        System.out.println(name + "开始买咖啡");
        System.out.println(name + "正在买咖啡");
        System.out.println(name + "买完了");
    }

    public static void main(String[] args) {
        Thread t1 = new Thread(new lr("张三"));
        Thread t2 = new Thread(new lr("李四"));
        Thread t3 = new Thread(new lr("王五"));
        System.out.println("run方法并不会启动新的线程,只是执行线程中run内的方法,仍然是在主线程上依次上进行");
        t1.run();
        t2.run();
        t3.run();
        System.out.println("start方法会启动新的线程,并发执行");
        t1.start();
        t2.start();
        t3.start();
    }
}
class lr implements Runnable{

    String name;

    public lr(String name) {
        this.name = name;
    }
    @Override
    public void run() {
        LRunnableOne.buyCoffee(name);
    }
}

 

 

 这里我们先是直接调用了run方法,又调用了start方法,这样做是为了说明start方法与run方法的不同。start方法是启动就绪的线程,然后调用线程内的run方法;run并不会启动线程,只是执行其中的方法体。start方法只能调用一次,但是run方法可以调用多次。

 

2.继承Thread类

package multithreading;

public class LThreadOne {

    public static void buyCoffee(String name) {
        System.out.println(name + "开始买咖啡");
        System.out.println(name + "正在买咖啡");
        System.out.println(name + "买完了");
    }

    public static void main(String[] args) {
        th th1 = new th("张三");
        th th2 = new th("李四");
        th th3 = new th("王五");
        th1.start();
        th2.start();
        th3.start();
    }
}

class th extends Thread {

    String name;

    public th(String name) {
        this.name = name;
    }
    @Override
    public void run() {
        LThreadOne.buyCoffee(name);
    }
}

3.实现Callable接口

package multithreading;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class LCallable {

    public static void buyCoffee(String name) {
        System.out.println(name + "开始买咖啡");
        System.out.println(name + "正在买咖啡");
        System.out.println(name + "买完了");
    }

    public static void main(String[] args) {
        lca l1 = new lca("张三");
        lca l2 = new lca("李四");
        lca l3 = new lca("王五");
        FutureTask futureTask1 = new FutureTask<>(l1);
        FutureTask futureTask2 = new FutureTask<>(l2);
        FutureTask futureTask3 = new FutureTask<>(l3);
        Thread thread1 = new Thread(futureTask1);
        Thread thread2 = new Thread(futureTask2);
        Thread thread3 = new Thread(futureTask3);
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

class lca implements Callable {

    String name;

    public lca(String name) {
        this.name = name;
    }

    @Override
    public String call() throws Exception {
        LCallable.buyCoffee(name);
        return null;
    }
}

 

 

以上就是java中三种实现多线程的方式。但是观察以上结果我们也不难发现一个问题,一个窗口售卖咖啡,应该是一个人买完了另一个人才能开始买。还好这里仅仅是售卖咖啡,如果是银行的存取款,就可能会出现一笔存款被取多次的问题,这就是线程的安全问题。

线程安全问题:当多个线程操作同一个数据时,可能会出现数据的异常。

具体解决线程安全问题就需要用到同步和互斥的概念了。

互斥:一个共享资源,A访问时,其它的都被阻塞(不能访问),当A访问完成时另一个才能访问;

同步:A的结果是B的前提,也就是A、B不能同时运行。

互斥是一种特殊的同步,而同步是更为复杂的互斥。

 

(本文仅作个人学习记录用,如有纰漏敬请指正)

 

标签:java,name,Thread,start,三种,new,多线程,public,String
From: https://www.cnblogs.com/jmsstudy/p/16876243.html

相关文章

  • 高精度加法(Java)
    题目描述高精度加法,相当于a+bproblem,不用考虑负数。输入格式分两行输入。a,b≤ 10^500输出格式输出只有一行,代表a+b 的值。思路使用数组进行模拟,如果......
  • 生成nuxt3项目的三种方法
    方法一:npxnuxiinitnuxt-app方法二:到github的nuxt仓库下的一个叫starter的项目中:https://github.com/nuxt/starter  点击code下载,之后安装依赖方法三:去官网......
  • 无法打开调试器端口(127.0.0.1:xxxx): java.net.BindException "Address already
    开启项目突然报错1099端口冲突和debug端口冲突,修改端口号没有用依旧冲突,查看端口进程为空,重新配置tomcat、重启电脑和关闭HyperV无效果。删除C:\Users\用户名\AppData\Lo......
  • 棋盘覆盖(java实现)
    棋盘覆盖问题描述在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L......
  • Java对用户使用功能排序
    精确统计页面停留时长介绍页面停留时间(TimeonPage)简称Tp,是网站分析中很常见的一个指标,用于反映用户在某些页面上停留时间的长短,传统的Tp统计方法会存在一定的统计盲区......
  • ZooKeeper Java API
    ZooKeeper是一个分布式应用程序协调服务,主要用于解决分布式集群中应用系统的一致性问题。它能提供类似文件系统的目录节点树方式的数据存储,主要用途是维护和监控所存数据的......
  • Java输出SSL握手日志和查看cacerts路径
    在JAVA启动时添加下面的VM参数就可以启动握手日志了!!!-Djavax.net.debug=all另外,在debug日志中,有一个trustStoreis关键字,根据这个可以找到使用的是哪个truststor......
  • 多线程测试
    编写多线程程序,主线程中开启两个线程,一个线程打印十个偶数随机数,一个线程打印十个奇数随机数。#include <stdio.h>#include<stdlib.h>#include<string.h>#incl......
  • 电信AEP物联网平台JAVA SDK对接案例
    在AEP平台中创建应用,在应用详情中可查看AppKey和AppSecret信息。右下角可下载各个版本的sdk,这里我们选中java版本下载。下载的sdk中包含以下信息:demo包里面包含了各个......
  • 小新学Java6-【继承、super、this、抽象类】
    一、继承1.概述:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。其中,多个类可以称为子类,单独那一......