首页 > 其他分享 >多线程

多线程

时间:2024-09-06 11:22:54浏览次数:6  
标签:run Thread int 线程 new 多线程 public

线程(Thread)概述

线程是一个程序内部的一条执行流程。

多线程指的是从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行)。

多线程的创建方式

1.继承Thread。重写run方法,在run中执行

每次执行结果都会不一样

public class ThreadTest1 {
    // main方法是一条或多条线程负责执行。
    public static void main(String[] args) {
        // 创建MyThread类的对象代表一条线程
        Thread t = new MyThread();
        // 启动线程(会调用run方法)
        t.start();
        
        for (int i = 1; i <= 5; i++) {
            System.out.println("主线程main输出: " + i);
        }
    }
}

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println("子线程MyThread输出: " + i);
        }
    }
}

优点:编码简单

缺点:线程类已经继承Thread,无法继承其他类,不利于功能扩展。

注意事项:1.启动线程一定是start方法,不是run方法,否则就相当于单线程,执行完run才去执行后边程序。

   2. 不要把主线程任务放到子线程之前。这条和上一条恰恰相反。

2.实现Runnable接口

接口

public class MyRunnable implements Runnable {
    // 重写Runnable的run方法
    @Override
    public void run() {
        // 线程要执行的任务
        for (int i = 1; i <= 5; i++) {
            System.out.println("子线程输出 ===> " + i);
        }
    }
}

主函数

public class ThreadTest2 {
    public static void main(String[] args) {
        // 创建任务对象
        Runnable target = new MyRunnable();
        // 把任务对象交给一个线程对象处理
        new Thread(target).start();

        for (int i = 1; i <= 5; i++) {
            System.out.println("主线程main输出 ===> " + i);
        }
    }
}

优点:任务类只是实现接口,可以继续继承其他类、实现其他接口,扩展性强。

3.方法二的匿名内部类写法

public class ThreadTest {
    public static void main(String[] args) {
        Runnable target = new MyRunnable();
        new Thread(target).start();

        // 简化形式1:使用匿名内部类
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.println("子线程2输出: " + i);
                }
            }
        }).start();

        // 简化形式2:使用Lambda表达式
        new Thread(() -> {
            for (int i = 1; i <= 5; i++) {
                System.out.println("子线程3输出: " + i);
            }
        }).start();

        for (int i = 1; i <= 5; i++) {
            System.out.println("主线程main输出: " + i);
        }
    }
}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println("子线程1输出: " + i);
        }
    }
}

方法三:使用Callable接口

前两个线程创建方式都存在一个问题,假如线程执行完毕后有一些数据需要返回,他们重写的run方法均不能直接返回结果。

多线程_主线程

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

public class test {
    public static void main(String[] args) throws Exception {
        // 3. 创建一个Callable的对象
        Callable<String> call = new MyCallable( 100);
        // 4. 把Callable的对象封装成一个FutureTask对象(任务对象)
        // 未来任务的作用?
        // 1. 是一个任务对象,实现了Runnable对象。
        // 2. 可以在线程执行完毕之后,用来任务对象调用get方法获取线程执行完毕后的结果值。
        FutureTask<String> f1 = new FutureTask<>(call);
        // 5. 把任务对象交给一个Thread对象
        new Thread(f1).start();

        // 6. 获取线程执行完毕后返回的结果。,结果可能正常,可能异常,需要把异常抛出去
//        执行到这里的时候,如果run方法没跑完,代码会在这里暂停,直到run方法执行完毕。
        String rs = f1.get();
        System.out.println(rs);
    }
}

接口

import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {
    private int n;
    public MyCallable(int n) {
        this.n = n;
    }
    @Override
    public String call() throws Exception {
        //线程任务,返回结果
//        需求:求1~n的和,并返回
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += i;
        }
        return "1~" + n + "的和为:" + sum;
    }
}

优点:线程任务类只是实现接口,可以继续继承和实现接口,扩展性强。可以在线程执行完后获取线程执行的结果。

缺点:编码复杂一点。

三种方法按需使用。

Thread常用方法

多线程_System_02

public class ThreadTest1 {
    public static void main(String[] args) {
        Thread t1 = new MyThread("1号线程");
        // t1.setName("1号线程");
        t1.start();
        System.out.println(t1.getName()); // Thread-0

        Thread t2 = new MyThread("2号线程");
        // t2.setName("2号线程");
        t2.start();
        System.out.println(t2.getName()); // Thread-1

        // 主线程对象的名字
        // 主线程的名字:它负责把我们的代码执行。
        Thread m = Thread.currentThread();
        m.setName("主线程");
        System.out.println(m.getName()); // main

        for (int i = 1; i <= 5; i++) {
            System.out.println(m.getName() + "线程输出:" + i);
        }
    }
}
public class MyThread extends Thread {
    public MyThread(String name) {
        super(name); // 为当前线程设置名字
    }

    @Override
    public void run() {
        // 哪个线程执行它,它就会得到哪个线程对象。
        Thread t = Thread.currentThread();
        for (int i = 1; i <= 3; i++) {
            System.out.println(t.getName() + "输出:" + i);
        }
    }
}
public class ThreadTest2 {
   public static void main(String[] args) throws Exception {
    for (int i = 1; i <= 5; i++) {
        System.out.println(i);
        // 休眠5s
        if (i == 3) {
            // 会让当前执行的线程暂停5秒,再继续执行
            // 项目经理让我加上这行代码,如果用户发钱了,我就注释掉!
            Thread.sleep(5000);
        }
    }

    // join方法作用:让当前调用这个方法的线程先执行完。
    Thread t1 = new MyThread("1号线程");
    t1.start();
    t1.join();

    Thread t2 = new MyThread("2号线程");
    t2.start();
    t2.join();

    Thread t3 = new MyThread("3号线程");
    t3.start();
    t3.join();
}

}


标签:run,Thread,int,线程,new,多线程,public
From: https://blog.51cto.com/u_16382144/11936702

相关文章

  • Java高级编程—多线程(完整详解线程的三种实现方式、以及守护线程、出让线程、插入线程
    二十八.多线程文章目录二十八.多线程28.1线程的三种实现方式28.1.1第一种28.1.2第二种28.1.3第三种28.2常见的成员方法28.3守护线程28.4出让线程28.5插入线程28.6线程生命周期28.7同步代码块28.8同步方法28.1线程的三种实现方式继承Thread类的方式进行......
  • Java多线程
    Java多线程什么是多线程和线程安全?多线程多线程的特点:线程安全线程安全的实现方式:举例说明:Java实现线程安全的几种方式1.**使用同步块(`synchronized`)**2.**使用显式锁(`Lock`接口)**3.**使用并发容器**4.**原子类(`Atomic`包)**5.**线程本地变量(`ThreadLocal`)**6.**......
  • 多线程
    多线程进程和线程区别并行和并发区别创建线程的方式(高频)线程包含哪些状态,状态如何的变化(高频)搜生命周期现成顺序执行java中的wait和sleep方法的不同wait必须要和syn..锁一块使用,不然报错如何停止一个正在运行的线程线程安全问题synchronized关键字底层......
  • Java多线程
    进程and线程    进程是程序的一次动态执行过程。经历了从代码加载、执行到执行完毕的一个完整过程;(由于CPU的执行速度很快,使得所有的进程像是“同时”执行一样)多线程是实现并发机制的一种有效手段。线程是比进程更小的执行单位,多线程是指一个进程在执行过程中可以产......
  • 多线程7
    多线程知识点概述1.什么是多线程1)一个进程中往往有多条程序执行路径,该程序可以理解为多线程程序2)java程序的入口是main方法,从操作系统的角度看,main方法的启动意味着启动了一个java进程。main方法所在的程序执行路径即为主线程,同时,main线程的启动,会伴随着其他线程的创建和启动,......
  • 多线程5
    102.final如果修饰的是集合,则没有办法保证线程安全103.通过Executors返回的线程池对象存在的弊端:·FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM·CachedThreadPool和ScheduledThreadPool:允许的创建线程数量为......
  • 【python】socket 入门以及多线程tcp链接
    Socket入门及多线程tcp链接网络基础知识三要素Socket是套接字的意思,是网络编程的核心对象,通信两端都独有自己的Socket对象,数据在两个Socket之间通过字节流(TCP协议)或者数据报包(UDP协议)的形式进行传输.本文主要针对tcp流程进行讲解socket-tcp流程图1.创建......
  • SQLServer事务复制延迟优化之多并行(多线程)复制
    事务复制的延迟在数据库的主从复制过程中,包括MySQL的主从复制,SQLServer的事务复制等等,鉴于主节点往往是并发写入的,而从节点(SQLServer中叫做订阅节点)在重放主节点的写操作的时候,往往会产生一定时间的延迟,如何降低这种复制延迟,并行复制或者说多线程复制是其中手段之一。 SQLServ......
  • 【Linux修行路】多线程——互斥量
    目录⛳️推荐一、多线程模拟抢票二、加锁——互斥量2.1pthread_mutex_init——初始化互斥量2.2pthread_mutext_destroy——销毁一个互斥量2.3pthread_mutex_lock——加锁2.4pthread_mutex_trylock——非阻塞的申请锁2.4pthread_mutex_unlock——解锁2.5定义一个......
  • Linux C++ 多线程高并发服务器实战项目一
    1、项目介绍1、按照包头+包体的格式收发数据包,解决粘包的问题2、非常完整的多线程高并发服务器3、根据收到数据包执行,不同的业务逻辑函数用到的技术:epoll高并发通讯技术,用的是水平触发【LT】水平触发模式通过线程池技术处理业务逻辑多线程、之间同步技术使用,互斥量、和条件变......