Scala语法(五) Actor与线程池

2024-05-14 07:58
文章标签 线程 语法 scala actor

本文主要是介绍Scala语法(五) Actor与线程池,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在前面的章节内, 我们介绍了Scala基础、集合、方法与函数体, 以及模式匹配的相关知识. 本章简单的介绍了Actor的相关知识.


正文

  • 创建Actor
    个人理解Actor对象与Java内的Thread对象相似. 创建时通过继承的方式创建Actor类, 并通过start()方法启动Actor子线程.

import scala.actors.Actor/*** 使用Actor的方式启动线程.* 1. 调用start()方法启动Actor* 2. 调用start()方法后, act方法会被执行* 3. 向Actor发送消息.* * | 发送异步消息 没有返回值* |? 发送同步消息,等待返回值* |! 发送异步消息,返回值为Future[Any]* */
// Actor已经2.11.x版本已经被移除了 使用的是Akka内的Actor.
object QuickActorA extends  Actor{def act(){for( i <- 1 to 100){println("actor1-"+i)Thread.sleep(1000)}}
}
object QuickActorB extends  Actor{def act(){for( i <- 1 to 100){println("actor2-"+i)Thread.sleep(1000)}}
}
object QucikActor {def main(args: Array[String]): Unit = {QuickActorA.start()QuickActorB.start()}
}
  • 持久通信

import scala.actors.Actor/*** Actor不断的接收消息.* * */
class QuickActorReceiveA extends Actor {def act():Unit = {while(true){receive{case "start" => {println("Start")}case "stop" => {println("Stop")}}}}
}
object QuickActorReceive {def main(args: Array[String]): Unit = {val actor = new QuickActorReceiveA()actor.start()actor ! "start"actor ! "stop"}
}
  • React方法通信
import scala.actors.Actorclass QuickActorReactA extends Actor {def act():Unit ={loop{// 复用线程池react{case "start" => {println("start"); Thread.sleep(1000); }case "stop" => {println("stop") ;Thread.sleep(1000);}case "exit" => {exit()}}}}
}
object QuickActorReact {def main(args: Array[String]): Unit = {val quickActorReactA = new QuickActorReactA()quickActorReactA.start()quickActorReactA ! "start"quickActorReactA ! "stop"quickActorReactA ! "exit"}
}
  • 创建线程池(Java)

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;/**** Java内进行线程池声明代码.*/
public class QuickJavaThreadPool {public static void main(String[] args) {// 定义线程池 并向其中塞任务ExecutorService pool = Executors.newCachedThreadPool();for(int i=0;i<10;i++) {pool.execute(new Runnable() {@Overridepublic void run() {System.out.println("Thread Name:"+Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});}Future<Integer> future = pool.submit(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {return 1;}});//		pool.shutdown();}
}
  • 创建线程池(Scala)

import java.util.concurrent.Executors
import java.util.concurrent.Future
import java.util.concurrent.Callable/*** 在Scala内使用线程池技术 创建 线程池.**/
object QuickThreadPool {def main(args: Array[String]): Unit = {val pool = Executors.newCachedThreadPool()for (i <- 1 to 10) {pool.execute(new Runnable() {def run(): Unit = {println("Thread-Name:" + Thread.currentThread().getName())Thread.sleep(1000)}})}val future:Future[Int] = pool.submit(new Callable[Int](){override def call():Int ={Thread.sleep(1000)100}}) var status = future.isDone()Thread.sleep(1000)status = future.isDone()if(status){println(future.get())}
//    pool.shutdown()}
}

这篇关于Scala语法(五) Actor与线程池的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988197

相关文章

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后