关键词:
文章目录:
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接口方法介绍实现步骤代码演示三种实现方式... 查看详情