首页 > 其他分享 >多线程-1

多线程-1

时间:2024-12-29 16:55:26浏览次数:1  
标签:run Thread getName 线程 多线程 public

多线程的相关概念


多线程的概念和优缺点
概念
多线程(Multi Thread):是指从软件或者硬件上实现多个线程并发执行的技术。本章主要讲软件上实现多线程技术。
优点

缺点

多线程实现方式
继承Thread

package com.aaa.mt.demo1;

/**
 * @FileName: MTExtendsThread
 * @Description:
 * @Author: zhz
 * @CreateTime: 2024/11/23 9:55
 * @Version: 1.0.0
 */
public class MTExtendsThread  extends  Thread{
    int i=10;
    /**
     * 线程执行任务的方法(要执行任务的代码都在这方法中)
     */
    @Override
    public void run() {
        //返回当前正在执行的线程对象
        Thread thread = Thread.currentThread();
        //getName()返回此线程的名称。
        System.out.println("线程:"+thread.getName()+",正在执行。。。。。。");
        //打印1-5
        for (int i = 1; i <= 5; i++) {
            System.out.println(i);
        }
    }

    /*public static void main(String[] args) {
        System.out.println("线程:"+Thread.currentThread().getName()+",正在执行。。。。。。");
        MTExtendsThread mtExtendsThread =new MTExtendsThread();
        mtExtendsThread.start();
        MTExtendsThread mtExtendsThread1 =new MTExtendsThread();
        mtExtendsThread1.start();
    }*/
}

实现Runnable接口

package com.aaa.mt.demo1;

/**
 * @FileName: MTImplementsRunnable
 * @Description:
 * @Author: zhz
 * @CreateTime: 2024/11/23 10:52
 * @Version: 1.0.0
 */
public class MTImplementsRunnable  implements Runnable{
    int i=10;
    @Override
    public void run() {
        //currentThread()返回当前正在执行的线程对象
        //getName()返回此线程的名称。
        System.out.println("线程:"+Thread.currentThread().getName()+",正在执行。。。。。。");
        //打印1-5
        for (int i = 1; i <= 5; i++) {
            System.out.println(i);
        }
    }

    public static void main(String[] args) {
        System.out.println("线程:"+Thread.currentThread().getName()+",正在执行。。。。。。");
        MTImplementsRunnable mtImplementsRunnable =new MTImplementsRunnable();
        //因为Runnable中没有start方法,借助Thread启动线程
        //多态  要的接口,实际传递的是子类
        Thread thread1 = new Thread(mtImplementsRunnable);
        thread1.start();
        Thread thread2 = new Thread(mtImplementsRunnable);
        thread2.start();
    }
}

实现Callable接口

package com.aaa.mt.demo1;

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

/**
 * @FileName: MTImplementsCallable
 * @Description:
 * @Author: zhz
 * @CreateTime: 2024/11/23 10:58
 * @Version: 1.0.0
 */
public class MTImplementsCallable  implements Callable<String> {
    @Override
    public String call() throws Exception {
        //currentThread()返回当前正在执行的线程对象
        //getName()返回此线程的名称。
        System.out.println("线程:"+Thread.currentThread().getName()+",正在执行。。。。。。");
        //打印1-5
        for (int i = 1; i <= 5; i++) {
            System.out.println(i);
        }
        String randomStr = UUID.randomUUID().toString();
        System.out.println("线程的业务方法中,生成字符串:"+randomStr);
        //System.out.println(1/0);
        return randomStr;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("线程:"+Thread.currentThread().getName()+",正在执行。。。。。。");
        //实例化对象
        MTImplementsCallable mtImplementsCallable =new MTImplementsCallable();
        // FutureTask  是Runnable 和Future接口的子类
           //  Future
        // FutureTask 作用: 1,因为他是Runnable的子类,new Thread需要该子类, 所以能用来启动线程
        //                  2,Future 可以用来获取业务执行方法的返回值  获取异常
        FutureTask<String> futureTask =new FutureTask(mtImplementsCallable);
        //使用futureTask实例化Thread
        Thread thread = new Thread(futureTask);
        thread.start();
        String returnValue = futureTask.get();
        System.out.println("返回值为:"+returnValue);
    }
}

实现Runnable和Callable的区别?
1,方法不同一个run一个call
2,run方法没有返回值,call方法有返回值
3,run方法没有处理异常,call方法处理异常
多线程常用方法和生命周期
常用方法
run():线程执行任务的方法(要执行任务的代码都在这方法中)
start():启动线程,最终还是调用run()。
currentThread():返回对当前正在执行的线程对象的引用。
getName():返回此线程的名称。
sleep():使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)

package com.aaa.mt.demo2;

/**
 * @FileName: SleepDemo
 * @Description:
 * @Author: zhz
 * @CreateTime: 2024/11/23 11:41
 * @Version: 1.0.0
 */
public class SleepDemo implements Runnable{
    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            System.out.println(i+"线程"+Thread.currentThread().getName()+"正在执行!!");
            try {
                //使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)
                //1秒=1000毫秒
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public static void main(String[] args) {
        new Thread(new SleepDemo()).start();
    }
}

setName("T0"):将此线程的名称更改为等于参数 name 。
setPriority():更改此线程的优先级。

package com.aaa.mt.demo2;

/**
 * @FileName: PriorityDemo
 * @Description:
 * @Author: zhz
 * @CreateTime: 2024/11/23 11:48
 * @Version: 1.0.0
 */
public class PriorityDemo implements Runnable{
    @Override
    public void run() {
        System.out.println("线程"+Thread.currentThread().getName()+"正在执行!!");
    }

    public static void main(String[] args) {
        //实例化
        PriorityDemo priorityDemo =new PriorityDemo();
        //实例化Thread
        Thread thread1 = new Thread(priorityDemo);
        Thread thread2 = new Thread(priorityDemo);
        //线程优先级 级别一共10种 数字从1-10
        // 常量3个  1=MIN_PRIORITY 5=NORM_PRIORITY 10=MAX_PRIORITY
        //优先级高的,先启动的几率大  不是一定先启动
        thread1.setPriority(Thread.MIN_PRIORITY);
        thread2.setPriority(Thread.MAX_PRIORITY);
        //获取优先级
        System.out.println(thread1.getPriority());
        System.out.println(thread2.getPriority());
        thread1.start();
        thread2.start();
    }
}

getPriority():返回此线程的优先级。
生命周期/状态

标签:run,Thread,getName,线程,多线程,public
From: https://www.cnblogs.com/xiaomubupi/p/18639205

相关文章

  • 请问递归可不可以使用多线程?为什么?
    递归可以使用多线程,但这并不常见,且需要谨慎处理。在前端开发中,JavaScript等语言本身是单线程的,但通过WebWorkers或其他技术可以实现多线程。然而,将递归与多线程结合使用可能会带来一些复杂性和挑战。复杂性增加:递归本身就已经是一种相对复杂的编程模式,因为它涉及到函数调用......
  • Java 并发编程:掌握多线程的四个核心要点
    Java并发编程是后端开发中至关重要的一部分,它涉及到如何有效地使用多核处理器、提高程序的执行效率,并确保线程安全。无论是面试还是实际项目开发,掌握多线程编程的核心要点都至关重要。本文将围绕Java多线程编程的四个核心要点展开,帮助读者深入理解并发编程的基本原理、应用......
  • 记手动粗浅管理多线程的工具类
    首先新建一个线程池管理工具类ThreadPoolManagerUtilimportlombok.extern.slf4j.Slf4j;importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.ConcurrentHashMap;importjava.util.concurrent.ThreadFactory;importjava.util.concurrent.ThreadP......
  • Java多线程处理文件详解与代码示例
    在Java编程中,文件处理是一项常见的任务。当需要处理大量文件或处理文件的时间较长时,单线程的处理方式可能会显得效率低下。为了提高文件处理的效率,我们可以使用多线程技术。本文将详细介绍如何使用Java多线程来处理文件,并提供一个详细的代码示例,该示例可以直接运行。一、多线......
  • java 多线程处理list集合数据的实例应用
    众所周知创建线程的三种方式:继承Thread,重写run方法实现Runnable接口,重新run方法实现Callable接口,重写call方法下面使用Callable,来说一下为什么使用1.Thread类和Runnable接口都不允许声明检查型异常,也不能定义返回值。没有返回值这点稍微有点麻烦。不能声明抛出检查型异常则......
  • 多线程的实现原理
    多线程编程是一种允许在同一程序中同时执行多个线程的技术,以提高程序的性能和响应性。多线程的实现原理涉及操作系统、编程语言和编译器等多个层面。以下是对多线程实现原理的详细解释:多线程的基本概念线程(Thread):线程是程序执行的基本单元,是操作系统能够进行运算调度的最小单......
  • C#知识整理-多线程
    进程和线程进程是一种正在执行的程序。操作系统使用进程来分隔正在执行的应用程序。线程是操作系统向其分配处理器时间的基本单元。每个线程具有计划优先级并维护系统用于保存线程执行暂停时线程上下文的一组结构。线程上下文包含线程顺畅继续执行所需的全部信息,包括线程的一......
  • 【JUC编程】JUC 多线程基础全面解析(速食版,25年后更新专栏)
    这篇文章就多个方面简单涉及一些内容,到2025年我会更新并发编程这个专栏。计划在过年之前更新完,都是从基础到工作中常用(以及可能涉及到)的知识点,有些内容这篇文章没有提及。希望大家可以多多支持、关注一下!文章目录JUC多线程基础全面解析一、线程与并发基础1.什么是......
  • Java多线程处理文件详解与代码示例
    在Java编程中,文件处理是一项常见的任务。当需要处理大量文件或处理文件的时间较长时,单线程的处理方式可能会显得效率低下。为了提高文件处理的效率,我们可以使用多线程技术。本文将详细介绍如何使用Java多线程来处理文件,并提供一个详细的代码示例,该示例可以直接运行。一、多线程处......
  • MySQL的MTS(多线程复制)和GC(组提交)
    开启MySQL的MTS(多线程复制)和GC(组提交)的主要参数如下:MTS(多线程复制)参数:slave_parallel_workers:设置从库上可以并行执行的线程数量。例如:slave_parallel_workers=8slave_parallel_type:设置从库并行复制的类型,有两个选项:DATABASE:基于库级别的并行复制。LOGICAL_CLOCK:基......