首页 > 系统相关 >进程、线程,java如何实现多线程任务,Thread里面常用的方法

进程、线程,java如何实现多线程任务,Thread里面常用的方法

时间:2025-01-13 19:01:48浏览次数:3  
标签:java Thread void class 线程 new 多线程 public

1.线程和进程的概述

1.1什么是进程

正在执行的程序,称为进程。 进程是系统分配资源的单元。

1.2什么是线程

线程又称轻量级的进程,是CPU调度的基本单位,一个进程由一个或多个线程组成

进程与进程之间无法共享数据

同一个进程的线程与线程之间可以共享数据

2.并发与并行的概述

并行:2个或多个事件在同一时刻发生(同时发生 同时处理 执行者不是一个)

并发:2个或多个事件在同一时间段内发生(交替发生  执行者是一个)

3.为何使用多线程

为了提高cpu的使用率,提高的程序的效率。

4.java如何实现多线程任务

1. 继承Thread类

2.实现Runnable接口

3.实现Callable接

4.1Thread实现多线程

1.创建一个类继承Thread,重写run方法

2.创建线程并开启线程

public class MyThread {
    public static void main(String[] args) {
        Test01 t1=new Test01();
        t1.start();//开启线程,默认调用run()方法
        for (int i = 0; i < 20; i++) {
            System.out.println("main"+i);
        }
    }
}
class Test01 extends Thread{
    @Override
    public void run(){
        for (int i = 0; i < 20; i++) {
            System.out.println("线程"+i);
        }
    }
}

4.2.Runnable实现多线程

1.创建一个类实现Runnable接口


public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("线程"+i);
        }
    }
}

2.创建一个测试类,先创建任务对象,再创建线程对象,并把任务对象交予线程对象,再开启线程,最后创建一个主函数的线程,模拟多线程

public class Test01 {
    public static void main(String[] args) {
        //创建任务对象
        MyRunnable my=new MyRunnable();
        //创建线程对象,把任务对象交予线程对象
        Thread t=new Thread(my);
        t.start();

        for (int i = 0; i < 20; i++) {
            System.out.println("main"+i);
        }
    }
}

4.3.Callable实现多线程

1.创建一个类实现Callable接口

public class MyCall implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int sum=0;

        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName()+i);
            sum+=i;
        }
        return sum;
    }
}

2.创建任务对象,并将任务对象封装进FutureTask,创建线程对象 task交予线程对象,开启线程

public class Test01C {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建任务对象
        MyCall m=new MyCall();
        //将任务对象封装进FutureTask
        FutureTask task=new FutureTask<>(m);
        //创建线程对象,task交予线程对象
        Thread t=new Thread(task);
        t.start();
        for (int i = 0; i < 20; i++) {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName()+i);
        }
        System.out.println(task.get());
    }
}

4.4三种创建多线程的使用场景

1、继承Thread的方式:适合于这个任务只想被一个线程的对象执行的情况

2、实现Runnable接口方式:适合于一个任务想被多个线程执行的情况        卖票

3、实现Callable接口方式:也适合一个任务想被多个线程执行的情况,并且想得倒任务的执行结果

5.Thread里面常用的方法

5.1start()

开启线程,而且该方法只能调用一次。

5.2run()

线程开启后,获取cpu时间片后   执行的任务方法。

5.3设置或获取线程名

setName("")

getName()

getName()只能在Thread子类下使用
Thread.currentThread().getName()可以在任何位置使用

5.4休眠sleep

public class TestSleep {
    public static void main(String[] args) {
        My my=new My();
        my.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("main"+i);
        }
    }
}
class My extends Thread{
    @Override
    public void run(){
        for (int i = 0; i < 20; i++) {
            try {
                Thread.sleep(1000);//单位毫秒
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("......."+i);
        }
    }
}

5.5放弃yield

当前线程主动放弃时间片,回到就绪状态,竞争下一次时间片

public class My extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
           Thread.yield();
            System.out.println(Thread.currentThread().getName()+i);
        }
    }
}
public class Test01My {
    public static void main(String[] args) throws InterruptedException {
        My my=new My();
        my.setName("my线程a----------");
        My my2=new My();
        my2.setName("线程b-----------");
        my.start();
        my2.start();
    }
}

5.6加入join

允许其他线程加入到当前线程中,直到其他线程执行完毕后,当前线程才会执行。

public class Test01My {
    public static void main(String[] args) throws InterruptedException {
        My my=new My();
        my.setName("my线程a----------");
        My my2=new My();
        my2.setName("线程b-----------");
        my.start();
        my2.start();
        my.join();
        my2.join();
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName()+i);
        }
    }
}

5.7setPriority设置优先级

public class TestPrority {
    public static void main(String[] args) {
        My04 my=new My04("a");
        My04 my2=new My04("b");
        My04 my3=new My04("c");
        my.setPriority(Thread.MAX_PRIORITY);
        my2.setPriority(Thread.NORM_PRIORITY);
        my3.setPriority(Thread.MIN_PRIORITY);
        my.start();
        my2.start();
        my3.start();
    }
}
class My04 extends Thread{
    public My04(String name){
        super(name);
    }
    @Override
    public void run(){
        for (int i = 0; i < 20; i++) {


            System.out.println(Thread.currentThread().getName()+"......."+i);
        }
    }
}

5.8守护线程

线程对象. setDaemon(true)设置为守护线程。

线程有两类:用户线程(前台线程)和守护线程(后台线程) ​

如果程序中所有前台线程都执行完毕了,后台线程也会自动结束。

​垃圾回收线程属于守护线程。

public class TestDeamon {
    public static void main(String[] args) {
        My05 my05=new My05();
        //设置my05为守护线程,后台执行完毕,守护线程也结束
        my05.setDaemon(true);
        my05.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("main"+i);
        }
    }
}
class My05 extends Thread{
    @Override
    public void run(){
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"......."+i);
        }
    }
}


6.卖票

某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票。

package com.ghx.demo11301;

/**
 * @author :guo
 * @date :Created in 2025/1/13 14:55
 * @description:
 * @modified By:
 * @version:
 */
public class SellTicket implements Runnable{
    private int tickets=100;
    @Override
    public void run() {
        while (tickets > 0) {
            tickets--;
            System.out.println(Thread.currentThread().getName() + "卖了一张票,还剩" + tickets+"张");
        }
    }
}

package com.ghx.demo11301;

/**
 * @author :guo
 * @date :Created in 2025/1/13 14:57
 * @description:
 * @modified By:
 * @version:
 */
public class SellTicketDemo {
    public static void main(String[] args) {
        SellTicket sellTicket=new SellTicket();
        Thread t=new Thread(sellTicket,"窗口a");
        Thread t2=new Thread(sellTicket,"窗口b");
        Thread t3=new Thread(sellTicket,"窗口c");
        t.start();
        t2.start();
        t3.start();
    }
}

出现的问题

重卖,超卖的线程安全问题

 

标签:java,Thread,void,class,线程,new,多线程,public
From: https://blog.csdn.net/weixin_51635918/article/details/145110368

相关文章

  • java企业人事档案管理系统论文+源码 2025毕设
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在当今企业快速发展的环境下,企业规模不断扩大,员工数量日益增多,人事管理工作变得愈发复杂。传统的人事档案管理方式主要依赖手工操作和纸质档案,这......
  • java面试刷题系统设计论文+源码 2025毕设
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着就业市场竞争的日益激烈,面试在求职过程中的重要性愈发凸显。如今,计算机技术的广泛应用为面试准备提供了新的途径。在传统的面试准备过程中,求......
  • 方法引用与lambda底层原理&Java方法引用、lambda能被序列化么?
    0.引入最近笔者使用flink实现一些实时数据清洗(从kafka清洗数据写入到clickhouse)的功能,在编写flink作业后进行上传,发现运行的时候抛出:java.io.NotSerializableException,错误消息可能类似于“org.apache.flink.streaming.api.functions.MapFunctionimplementationisnotser......
  • 基于java的停车场车牌识别系统
    一、系统背景与意义随着城市化进程的加速,停车场管理面临着越来越大的挑战。传统的手工记录车牌号方式不仅费时费力,还容易出错。而基于Java的停车场车牌识别系统的出现,则有效地解决了这一问题。该系统能够自动识别进出停车场的车辆车牌号,实现快速、准确的车辆管理,提高了停车......
  • 基于Java的外卖骑手管理系统
    一、系统背景与意义随着外卖行业的蓬勃发展,外卖配送成为了一个关键环节。传统的骑手管理方式存在调度不合理、信息更新不及时等问题,影响了配送效率和用户满意度。因此,开发一个基于Java的外卖骑手管理系统具有重要意义,它可以实现骑手的自动化管理,优化配送流程,提高配送效率,同......
  • JavaScript与服务器端框架Flask
    JavaScript与服务器端框架Flask基本概念和作用说明示例一:设置基本的Flask环境示例二:使用JavaScript发起请求功能使用思路及代码示例示例三:处理POST请求示例四:表单验证与反馈开发经验分享在现代Web开发中,前端和后端的紧密结合对于创建高效、响应迅速的应用程序至关......
  • 【最新原创毕设】基于SSM的在线学习平台+09650(免费领源码)可做计算机毕业设计JAVA、PHP
    目 录摘要1绪论1.1选题背景及意义1.2国内外现状分析1.3论文结构与章节安排2 在线学习平台系统分析2.1可行性分析2.2系统业务流程分析2.3系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4系统用例分析2.5本章小结3在线学习平台总体设......
  • 基于Java技术的救灾物资调动系统
    一、系统背景与意义随着自然灾害的频发,救灾工作的重要性日益凸显。传统的救灾物资管理方式往往依赖于人工操作,存在信息不透明、响应速度慢、资源分配不均等问题,难以满足快速响应和高效调配的需求。因此,开发基于Java技术的救灾物资调动系统显得尤为重要。该系统通过信息化手......
  • 基于Java农产品系统
    一、系统背景与意义随着农业科技的发展和农业产业化的推进,农产品销售行业面临着越来越多的挑战和机遇。为了提升农产品销售的效率与便捷性,降低运营成本,并为消费者提供更好的购物体验,开发基于Java的农产品系统显得尤为重要。该系统通过信息化手段,整合农产品资源,优化销售流程......
  • 如何使用 Java 的 Spring Boot 创建一个 RESTful API?
    大家好,我是V哥,使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤其适合现代软件开发的需求,帮助你快速构建出高性能的后端服务。例如,在企业级应用中,通常需要开发大量的业务功能,并且要求系统具有可扩展......