首页 > 编程语言 >java多线程

java多线程

时间:2024-06-20 20:30:31浏览次数:15  
标签:java Thread void 线程 static 多线程 public

目录

多线程的实现方式

多线程的第一种实现方式  继承Thread类的方式进行实现

多线程的第二种实现方式  实现Runnable接口的方式进行实现

利用Callable接口和Future接口方式实现 

多线程中常用的成员方法 

String getName()                返回此线程的名称

void setName(String name)                设置线程的名字(构造方法也可以设置名字) 

static Thread currentThread()                获取当前线程的对象

static void sleep(long time)                让线程休眠指定的时间,单位为毫秒

setPriority(int newPriority)        设置线程的优先级

final int getPriority()  获取线程的优先级

final void setDaemon(boolean on)                设置为守护线程

public static void yield()                出让线程/礼让线程

public static void join()        插入线程/插队线程

线程的生命周期 

同步代码块

同步方法


javajava

Java多线程

Java多线程是指在Java语言中使用多个线程实现并发执行的编程技术。Java多线程可以提高程序的并发处理能力,使程序能够同时执行多个任务。

Java多线程可以通过创建Thread类的实例或者实现Runnable接口来实现。创建线程的方式有两种:继承Thread类和实现Runnable接口。

继承Thread类的方式创建线程,需要重写Thread类的run()方法,并在run()方法中实现线程的具体逻辑。然后创建Thread类的实例,并调用start()方法来启动线程。

实现Runnable接口的方式创建线程,需要实现Runnable接口的run()方法,并在run()方法中实现线程的具体逻辑。然后创建Thread类的实例,并将实现了Runnable接口的对象作为参数传递给Thread类的构造方法,最后调用start()方法来启动线程。

Java多线程还可以通过使用线程池来管理线程,线程池可以重复利用已创建的线程,避免频繁创建和销毁线程的开销。

在Java多线程编程中,需要注意线程的同步和互斥。可以使用synchronized关键字或者Lock接口来实现线程的同步,防止多个线程同时访问共享数据导致的数据不一致或者出错的问题。

Java多线程还提供了一些线程间通信的机制,如使用wait()和notify()方法实现线程的等待和唤醒,使用join()方法等待线程执行完成等。

总之,Java多线程可以实现并发执行的编程,提高程序的处理能力,但同时也需要注意线程的同步和互斥以及线程间的通信。

多线程的实现方式

多线程的第一种实现方式  继承Thread类的方式进行实现

自己定义一个类经承Thresd,重写run方法,创建子类的对象,并启动线程

MyThread类 

package threadcase1;

public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName()+"hello world");
        }
    }
}

测试类

package threadcase1;

public class ThreadDemo {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        t1.setName("线程1");
        t2.setName("线程2");
        t1.start();
        t2.start();
    }
}

可以看到两个线程交替进行 

多线程的第二种实现方式  实现Runnable接口的方式进行实现

先写MyRun类

package threadcase2;

public class MyRun implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            //获取当前线程对象
            Thread t = Thread.currentThread();
            System.out.println(t.getName()+"hello world");
        }
    }
}

 测试类

package threadcase2;

public class ThreadDemo {
    public static void main(String[] args) {
        //创建MyRun对象
        MyRun mr = new MyRun();
        //创建线程对象
        Thread t1 = new Thread(mr);
        Thread t2 = new Thread(mr);
        //给线程设置名字
        t1.setName("线程1");
        t2.setName("线程2");
        //开启线程
        t1.start();
        t2.start();
    }
}

 

利用Callable接口和Future接口方式实现 

创建一个类MyCallable实现callable接口重写call(是有返回值的,表示多线程运行的结果)

创建MyCallable的对象(表示多线程要执行的任务)

创建FutureTask的对象(作用管理多线程运行的结果)

创建Thread类的对象,并启动(表示线程) 

MyCallable类

package threadcase3;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int sum=0;
        for (int i = 0; i <= 100; i++) {
                sum=sum+i;
        }
        return sum;
    }
}

 测试类

package threadcase3;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class ThreadDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建MyCallable的对象(表示多线程要执行的任务)
        MyCallable mc = new MyCallable();
        //创建FutureTask的对象(作用管理多线程运行的结果)
        FutureTask ft = new FutureTask<>(mc);
        //创建Thread类的对象,并启动(表示线程)
        Thread t1 = new Thread(ft);
        //启动线程
        t1.start();
        //获取多线程运行的结果
        Object result = ft.get();
        System.out.println(result);
    }
}

 

继承Thread类 优点:编程比较简单,可以直接使用Thread类中的方法
                        缺点:可以扩展性较差,不能再继承其他的类 

实现Runnable接口    优点: 扩展性强实现该接口的同时还可以继承其他的类

                                缺点:编程相对复杂,不能直接使用Thread类中的方法

实现Callable接口     优点:  扩展性强实现该接口的同时还可以继承其他的类

                                缺点:编程相对复杂,不能直接使用Thread类中的方法

想要获取多线程运行的结果就用Callable接口的方法 

多线程中常用的成员方法 

String getName()                返回此线程的名称
void setName(String name)                设置线程的名字(构造方法也可以设置名字)
static Thread currentThread()                获取当前线程的对象

static void sleep(long time)                让线程休眠指定的时间,单位为毫秒

setPriority(int newPriority)        设置线程的优先级

final int getPriority()  获取线程的优先级
final void setDaemon(boolean on)                设置为守护线程
public static void yield()                出让线程/礼让线程
public static void join()        插入线程/插队线程

String getName()                返回此线程的名称

 

如果我们没有给线程设置名字,线程也是有默认的名字的格式:Thread-x(X序号,从0开始的) 

void setName(String name)                设置线程的名字(构造方法也可以设置名字) 

如果我们要给线程设置名字,可以用set方法进行设置,也可以构造方法设置 

 

static Thread currentThread()                获取当前线程的对象

package Threadmethod;

public class ThreadDemo {
    public static void main(String[] args) {
       
        Thread t = Thread.currentThread();
        String name = t.getName();
        System.out.println(name);
    }
}

 

当JVM虚拟机启动之后,会自动的启动多条线程其中有一条线程就叫做main线程他的作用就是去调用main方法,并执行里面的代码 

static void sleep(long time)                让线程休眠指定的时间,单位为毫秒

package Threadmethod;

public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {

        System.out.println("111111");
        Thread.sleep(3000);
        System.out.println("222222");
    }
}

哪条线程执行到这个方法,那么哪条线程就会在这里停留对应的时间

方法的参数:就表示睡眠的时间,单位毫秒

当时间到了之后,线程会自动的醒来,继续执行下面的其他代码

setPriority(int newPriority)        设置线程的优先级

坦克的优先级比飞机的高,但是飞机比坦克先执行完成,优先级不是绝对的,是概率问题

final int getPriority()  获取线程的优先级

 

final void setDaemon(boolean on)                设置为守护线程

 

当其他的非守护线程执行完毕之后,守护线程会陆续结束 

public static void yield()                出让线程/礼让线程

 

会让结果尽可能的均匀一些,但不是绝对的 

public static void join()        插入线程/插队线程

下面的就是插入线程

标签:java,Thread,void,线程,static,多线程,public
From: https://blog.csdn.net/m0_46702681/article/details/139631290

相关文章

  • Java学习基础笔记——多线程基础部分
    第十三章多线程基础13.1线程介绍13.1.1线程相关概念13.2线程创建13.2.1创建线程的两种方式13.2.2继承Threadvs实现Runnable的区别13.2.3线程终止13.3线程方法13.3.1常用方法第一组13.3.2常用方法第二组13.3.3用户线程和守护线程13.4Synchronized13......
  • Java学习基础笔记——反射机制
    第十五章反射15.1反射机制15.1.1 Java反射机制可以完成15.1.2 反射的优缺点15.2Class类15.2.1基本介绍15.2.2Class类常用方法15.2.3获取Class类对象6种方式15.3类加载15.3.1基本说明15.3.2类加载时机15.4反射获取类的结构信息15.5反射调用性能......
  • Java毕业设计 基于springboot vue音乐网站
    Java毕业设计基于springbootvue音乐网站SpringBoot音乐网站功能介绍首页图片轮播歌曲信息歌曲分类歌曲详情歌曲播放音乐下载评论注册登录个人中心更新信息用户后台:登录个人中心修改密码个人信息音乐下载管理员:登录个人中心修改密码个人信息用户管......
  • JAVA基础——接口(全网最详细教程)
    概述我们已经学完了抽象类,抽象类中可以用抽象方法,也可以有普通方法,构造方法,成员变量等。那么什么是接口呢?接口是更加彻底的抽象,JDK7之前,包括JDK7,接口中全部是抽象方法。接口同样是不能创建对象的。  把特有的方法(行为)写成接口,要用的时候调用接口就行了,除了狗和青蛙......
  • 2024年 Java 面试八股文(20w字)
    第一章-Java基础篇1、你是怎样理解OOP面向对象   难度系数:⭐面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征:继承:继承是从已有类得到继承信息创建新类的过程封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口多态性:多态性是指允......
  • Java面试八股文2024最新版
    一、java基础1、java有哪几种数据类型?基本数据类型:byte(1),char(2),short(2),int(4),long(8),double(8),float(4),boolean(1)引用数据类型:各种类和接口,枚举,数组2、 面向对象和面向过程的区别?面向对象和面向过程都是一种开发思想。面向过程就是根据解决问题所需要的步骤,具体化的一步一步的去实现......
  • 微信小程序源码-基于Java后端的教学质量评价系统的计算机毕业设计(附源码+论文)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • Java跳动爱心代码
    1.计算爱心曲线上的点的公式计算爱心曲线上的点的公式通常基于参数方程。以下是两种常见的参数方程表示方法,用于绘制爱心曲线:1.1基于(x,y)坐标的参数方程x=a*(2*cos(θ)-sin(θ))^3y=a*(2*sin(θ)-cos(θ))^3其中,a是一个常数,用于控制爱心的大小;θ是参......
  • 腾讯云部署的java服务,访问阿里云的mysql数据库,带宽异常偏高,可能是什么原因
    个人名片......
  • java通过jts获取点到线的垂足点
    在Java中,可以使用JTS(JavaTopologySuite)库来获取点到线段的垂足点。以下是一个简单的示例代码,展示了如何使用JTS获取点到线段的垂足点:首先,确保你的项目中包含了JTS库。importorg.locationtech.jts.algorithm.distance.DistanceToPoint;importorg.locationtech.jts.algor......