java——多线程高并发系列之创建多线程的三种方式(threadrunnablecallable)(代码片段)

张起灵-小哥 张起灵-小哥     2022-12-26     175

关键词:

文章目录:

写在前面

Demo1(继承Thread类,重写run()方法)

Demo2(实现Runnable接口,重写run()方法)

Demo3(实现Callable接口,重写call()方法)


写在前面

历时一个星期,终于整完了Java多线程高并发这个系列的相关内容,这是最后一篇关于多线程的文章了,打算回到最初学习多线程的起点:总结一下创建多线程的三种方式吧。


Demo1(继承Thread类,重写run()方法)

package com.szh.begin;

/**
 * 实现多线程的第一种方式:继承Thread类,重写run()方法
 */
public class Test01 

    static class MyThread extends Thread 
        @Override
        public void run() 
            for (int i = 0; i < 5; i++) 
                System.out.println(Thread.currentThread().getName() + " ---> " + i);
            
        
    

    public static void main(String[] args) 
        MyThread t1=new MyThread();
        MyThread t2=new MyThread();

        t1.setName("t1");
        t2.setName("t2");

        //start方法的作用是:启动一个分支线程,在JVW中开辟一个新的栈空间
        //只要栈空间开辟出来,start方法就结束了,线程就启动成功了,启动成功的线程会自动调用run方法
        //run方法在分支线程的栈底部,main方法在主线程的栈底部,run和main是平级的
        t1.start();
        t2.start();

        //上面的代码也可以写成下面这种形式
//        new MyThread().start();
//        new MyThread().start();
    


Demo2(实现Runnable接口,重写run()方法)

传统写法

package com.szh.begin;

/**
 * 实现多线程的第二种方式:实现Runnable接口,重写run()方法
 * 传统写法
 */
public class Test02 

    static class MyRunnable implements Runnable 

        @Override
        public void run() 
            for (int i = 0; i < 5; i++) 
                System.out.println(Thread.currentThread().getName() + " ---> " + i);
            
        
    

    public static void main(String[] args) 
        new Thread(new MyRunnable(),"t1").start();
        new Thread(new MyRunnable(),"t2").start();
    

匿名内部类写法

package com.szh.begin;

/**
 * 实现多线程的第二种方式:实现Runnable接口,重写run()方法
 * 匿名内部类写法
 */
public class Test03 

    public static void main(String[] args) 

        new Thread(new Runnable() 
            @Override
            public void run() 
                for (int i = 0; i < 5; i++) 
                    System.out.println(Thread.currentThread().getName() + " ---> " + i);
                
            
        ).start();

        new Thread(new Runnable() 
            @Override
            public void run() 
                for (int i = 0; i < 5; i++) 
                    System.out.println(Thread.currentThread().getName() + " ---> " + i);
                
            
        ).start();

    


Demo3(实现Callable接口,重写call()方法)

使用Future接收线程的执行结果

package com.szh.begin;

import java.util.concurrent.*;

/**
 * 实现多线程的第三种方式:实现Callable接口,重写call()方法
 * 使用Future接收线程的执行结果
 */
public class Test04 

    static class MyCallable implements Callable<Object> 

        @Override
        public Object call() throws Exception 
            for (int i = 0; i < 5; i++) 
                System.out.println(Thread.currentThread().getName() + " ---> " + i);
            
            return "当前执行线程的id为:" + Thread.currentThread().getId();
        
    

    public static void main(String[] args) throws ExecutionException, InterruptedException 
        //创建一个固定大小的线程池
        ExecutorService service= Executors.newFixedThreadPool(2);
        //提交执行
        Future<Object> future1=service.submit(new MyCallable());
        Future<Object> future2=service.submit(new MyCallable());
        //获取call()方法的返回值(即线程执行结果的返回值)
        Object obj1=future1.get();
        Object obj2=future2.get();
        //打印
        System.out.println(obj1);
        System.out.println(obj2);
        //关闭线程池
        service.shutdown();
    

使用FutureTask接收线程的执行结果

package com.szh.begin;

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

/**
 * 实现多线程的第三种方式:实现Callable接口,重写call()方法
 * 使用FutureTask接收线程的执行结果
 */
public class Test05 

    static class MyCallable implements Callable<Object> 

        @Override
        public Object call() throws Exception 
            for (int i = 0; i < 5; i++) 
                System.out.println(Thread.currentThread().getName() + " ---> " + i);
            
            return "当前执行线程的id为:" + Thread.currentThread().getId();
        
    

    public static void main(String[] args) throws ExecutionException, InterruptedException 
        //new一个未来任务类对象,参数传入一个Callable接口实现类对象
        FutureTask<Object> task1=new FutureTask<>(new MyCallable());
        FutureTask<Object> task2=new FutureTask<>(new MyCallable());
        //创建两个线程对象,参数传入一个FutureTask对象,之后启动线程
        new Thread(task1).start();
        new Thread(task2).start();
        //获取t1线程的执行结果
        Object obj1=task1.get();
        Object obj2=task2.get();
        System.out.println(obj1);
        System.out.println(obj2);
    

 

java——多线程高并发系列之线程池(executor)的理解与使用(代码片段)

文章目录:写在前面Demo1(使用Executors创建线程池)Demo2(使用ThreadPoolExecutor创建线程池)关于ThreadPoolExecutor中的七大参数、四种拒绝策略线程池的执行策略写在前面可以以newThread(()->线程执行的任务).start();... 查看详情

java——多线程高并发系列之juc三大辅助类(countdownlatchcyclicbarriersemaphore)(代码片段)

...三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过多时Lock锁的频繁操作。这三种辅助类为:CountDownLatch:减少计数CyclicBarrier:循环栅栏Semaphore:信号灯1.CountDownLatchCountDownLatch类可以设置一个计数器,然后通... 查看详情

49多线程创建的三种方式之继承thread类(代码片段)

继承Thread类创建线程在java里面,开发者可以创建线程,这样在程序执行过程中,如果CPU空闲了,就会执行线程中的内容。使用Thread创建线程的步骤:1.自定义一个类,继承java.lang包下的Thread类2.重写run方法3.将要在线程中执行的... 查看详情

[java多线程]线程创建的三种方式,线程的互斥(代码片段)

前言多线程:指的是这个程序(一个进程)运行时产生了不止一个线程并行和并发:并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。并发:通过cpu调度算法,让用户看上去... 查看详情

java多线程实现的三种方式

 JAVA多线程实现的三种方式Java中继承thread类与实现Runnable接口的区别 查看详情

[java多线程]线程创建的三种方式,线程的互斥,线程的同步(代码片段)

前言多线程:指的是这个程序(一个进程)运行时产生了不止一个线程并行和并发:并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。并发:通过cpu调度算法,让用户看上去... 查看详情

java——多线程高并发系列之threadlocal的使用(代码片段)

...除了控制资源的访问外,还可以通过增加资源来保证线程安全。ThreadLocal主要解决为每个线程绑定自己的值。Demo1packagecom.szh.threadlocal;/***ThreadLocal的基本使用*/publicclassTest01//定义一个ThreadLocal对象staticThread 查看详情

java——多线程高并发系列之readwritelock读写锁(代码片段)

...entrantLock锁都是独占锁(排它锁),同一时间只允许一个线程执行同步代码块,可以保证线程的安全性,但是执行效率低。ReentrantRea 查看详情

java——多线程高并发系列之lockreentrantlock(代码片段)

文章目录:写在前面说说synchronized和Lock的区别?Demo1(先演示一下锁的可重入性)Demo2(ReentrantLock的基本使用)Demo3(使用Lock锁同步不同方法中的代码块)Demo4(ReentrantLock锁的可重入性)Demo 查看详情

java多线程的三种实现方式

今天简单说一下Java三种多线程实现方式和区别,主要有实现Runnable、Callable和继承Thread三种方式。实现Runnable的方式这种方式比较常用,当我们的线程类有继承其他的类的情况下(Java不支持类多继承),并且线程任务不需要返回... 查看详情

java——多线程高并发系列之synchronized关键字(代码片段)

文章目录:写在前面Demo1(synchronized面对同一个实例对象)Demo2(synchronized面对多个实例对象)Demo3(synchronized面对一个publicstaticfinal常量)Demo4(synchronized同步代码块分别位于实例方法、静态方法中& 查看详情

java——多线程高并发系列之arraylisthashsethashmap集合线程不安全的解决方案(代码片段)

1.ArrayList的线程不安全解决方案将main方法的第一行注释打开,多执行几次,会看到如下图这样的异常信息:👇👇👇这是一个并发修改异常,首先ArrayList肯定是线程不安全的,产生这个异常的原因... 查看详情

java——多线程高并发系列之wait()notify()notifyall()interrupt()(代码片段)

...时异常)Demo2(调用wait方法会使执行当前代码的线程进入等待状态)Demo3(notify方法会唤醒之前执行wait方法等待的线程) 查看详情

大数据必学java基础(七十六):创建线程的三种方式(代码片段)

文章目录创建线程的三种方式一、继承Thread类二、实现Runnable接口三、实现Callable接口创建线程的三种方式一、继承Thread类在学习多线程之前,以前的代码是单线程的吗?不是,以前也是有三个线程同时执行的。现在... 查看详情

java——多线程高并发系列之理解cas原子变量类的使用(代码片段)

文章目录:1.CAS2.原子变量类2.1AtomicInteger2.2AtomicLong2.3AtomicIntegerArray2.4AtomicIntegerFieldUpdater2.5AtomicReference2.6AtomicStampedReference1.CASCAS(CompareAndSwap)是由硬件实现的。CAS可以将read-modify-write 查看详情

java——多线程高并发系列之reentrantlock实现(非)公平锁常用方法的举例(代码片段)

文章目录:写在前面Demo1(公平锁与非公平锁)Demo2(intgetHoldCount()返回当前线程调用lock()方法的次数)Demo3(intgetQueueLength()返回正等待获得锁的线程预估数)Demo4(intgetWaitQueueLength(Condition 查看详情

ajpfx关于java多线程实现的三种方式

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1、继承Thread类实现多线程... 查看详情

java多线程实现的三种方式(代码片段)

文章目录实现多线程方式一:继承Thread类方法介绍实现步骤代码演示思考问题实现多线程方式二:实现Runnable接口Thread构造方法实现步骤代码演示实现多线程方式三:实现Callable接口方法介绍实现步骤代码演示三种实现方式... 查看详情